首页 > 解决方案 > 如何通过在 R 中生成新列来拆分这些数据

问题描述

我有 35 列,数据类似于此示例

df<-read.table (text=" Id Name Group   MN  AZ  KL  Norm
2  John  P1  12  7   17  21
11  Sarah W1  11  8   12  20
2   John L1  13  9   19  20
11  Sarah N1  14  12  16  18
", header=TRUE)

我想得到这些数据:

id  Name    Group1  MN1 AZ1 KL1 Norm1   Group2  MN2 AZ2 KL2 Norm2
2   John    P1  12  7   17  21  L1  13  9   19  20
11  Sarah   W1  11  8   12  20  N1  14  12  16  18

按组拆分的数据。我有一个解决方案可以通过基本的 rcode 或仅 dplyr 对这些数据进行排序。如您所见,列名称未拆分

标签: rdplyr

解决方案


不建议使用具有相似列名的数据框。对于每一个Id,我们可以创建一个行号列,它可以以宽格式附加到列名。

library(dplyr)

df %>%
  group_by(Id) %>%
  mutate(row = row_number()) %>%
  tidyr::pivot_wider(names_from = row, values_from = Group:Norm) %>%
  select(Id, order(readr::parse_number(names(.))))

#     Id Group_1  MN_1  AZ_1  KL_1 Norm_1 Group_2  MN_2  AZ_2  KL_2 Norm_2
#  <int> <chr>   <int> <int> <int>  <int> <chr>   <int> <int> <int>  <int>
#1     2 P1         12     7    17     21 L1         13     9    19     20
#2    11 W1         11     8    12     20 N1         14    12    16     18

parse_number返回一个警告,因为Id没有数字,但忽略它是安全的。


data.table如果列的顺序不重要,您也可以使用。

library(data.table)
dcast(setDT(df), Id~rowid(Id), value.var = c('Group', 'MN', 'AZ', 'KL', 'Norm'))

数据

df <- structure(list(Id = c(2L, 11L, 2L, 11L), Group = c("P1", "W1", 
"L1", "N1"), MN = c(12L, 11L, 13L, 14L), AZ = c(7L, 8L, 9L, 12L
), KL = c(17L, 12L, 19L, 16L), Norm = c(21L, 20L, 20L, 18L)), 
class = "data.frame", row.names = c(NA, -4L))

推荐阅读