按 id 将行聚合到多个列中,其中每个 id 的行数不同 (R)

aggregating rows by id into multiple columns where number of rows per id varies (R)

我的问题由于重复而被关闭,因为我没有很好地解释自己。这就是阻碍我使用 dplyr 的 gather-unite-spread 的问题。通常这是一项简单的任务,但有一些问题使得使用此数据集实现起来有些困难。

我有以下数据集

ID   V.1  V.2  V.3  V.4
1    x    y    Z    0
1    x    y    Z    0
1    x    y    Z    0
1    x    y    Z    1
2    x    y    Z    0 
2    x    y    Z    1
3    x    y    Z    0
3    x    y    Z    1

数据集需要如下所示

ID V.1a V.2a V.3a V.1b V.2b V.3b V.1c V.2c V.3c V.1d V.2d V.3d V.4
1  x    y    z    x    y    z    x    y    z    x    y    z    4
2  x    y    z    x    y    z    na   na   na   na   na   na   2 
3  x    y    z    x    y    z    na   na   na   na   na   na   2 

问题 - 每个唯一 ID 的行数不同

这似乎是我最大的问题。这导致列数不均匀,并使我通常的聚合方式不起作用。

如有任何帮助,我们将不胜感激。

这里有一个使用data.table

的方法
library(data.table)
setDT(dat)
out <- dcast(dat, ID ~ rowid(ID), value.var = c("V.1", "V.2", "V.3"))[
  dat[, .('V.4' = length(V.4)), by = ID], on = "ID"
]
out
#   ID V.1_1 V.1_2 V.1_3 V.1_4 V.2_1 V.2_2 V.2_3 V.2_4 V.3_1 V.3_2 V.3_3 V.3_4 V.4
#1:  1     x     x     x     x     y     y     y     y     Z     Z     Z     Z   4
#2:  2     x     x  <NA>  <NA>     y     y  <NA>  <NA>     Z     Z  <NA>  <NA>   2
#3:  3     x     x  <NA>  <NA>     y     y  <NA>  <NA>     Z     Z  <NA>  <NA>   2

我们使用 dcast 将列 V.1 从长到宽扩展到 V.3,然后将结果连接到 dat[, .('V.4' = length(V.4)), by = ID],后者只是聚合列 V.4

如果您想继续使用 data.frame,请使用 setDF(out)

数据

dat <- read.table(text = 'ID   V.1  V.2  V.3  V.4
1    x    y    Z    0
1    x    y    Z    0
1    x    y    Z    0
1    x    y    Z    1
2    x    y    Z    0 
2    x    y    Z    1
3    x    y    Z    0
3    x    y    Z    1',
                  header = TRUE, stringsAsFactors = FALSE)