【问题标题】:aggregating rows by id into multiple columns where number of rows per id varies (R)按 id 将行聚合到多个列中,其中每个 id 的行数不同(R)
【发布时间】:2019-05-16 04:28:38
【问题描述】:

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

我有以下数据集

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 的行数不同

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

任何帮助将不胜感激。

【问题讨论】:

    标签: r dataframe dplyr reshape plyr


    【解决方案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

    如果您想继续使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多