按ID将行汇总为多列,其中每个ID的行数各不相同(R)

时间:2018-12-14 22:13:01

标签: r dataframe dplyr reshape plyr

我的问题由于重复而被关闭,因为我没有很好地解释自己。此后出现的问题阻碍了我对dplyr的collect-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的行数不同

这似乎是我最大的问题。这导致列数不均匀,并且使我通常的聚合方法无效。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是使用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

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

数据

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)