【问题标题】:R Transformation Collapsing RowsR转换折叠行
【发布时间】:2015-08-08 14:34:36
【问题描述】:

我想获取一个数据框并折叠一列上的行,然后简单地创建另一列,它是所有值的向量。

例如,我想像这样转换一个数据框:

id  item
1   100
1   103
1   109
1   101
2   102
2   109
2   107
2   105
3   105
3   106
3   101
3   102
3   110

收件人:

id  item
1   (100,103,109,101)
2   (102,109,107,105)
3   (105,106,101,102,110)

所以第一列是唯一的 id,第二列是针对该 id 看到的所有项目的向量/列表。看起来这应该很容易,但我一直无法找到解决方案。如示例中所述,每个 id 的项目数量可能会有所不同。

这是创建我要转换的初始数据框的代码。

id <- c(1,1,1,1,2,2,2,2,3,3,3,3,3)
item <- c(100,103,109,101,102,109,107,105,105,106,101,102,110)
input_frame <- data.frame(cbind(id,item))

【问题讨论】:

标签: r transform


【解决方案1】:
library (plyr)
ddply(input_frame,.(id),summarize,val=paste(item,collapse=","))
  id                 val
1  1     100,103,109,101
2  2     102,109,107,105
3  3 105,106,101,102,110

【讨论】:

    【解决方案2】:
    library(dplyr)
    summarise(group_by(input_frame,id),item=paste(item,collapse=','))
    

    【讨论】:

      【解决方案3】:

      您可以使用aggregate 函数按id 进行分组,然后使用c 函数从item 中收集相应的元素:

      aggregate(formula = item ~ id, data = input_frame, FUN = c)
      

      输出:

         id                    item
      1  1      100, 103, 109, 101
      2  2      102, 109, 107, 105
      3  3 105, 106, 101, 102, 110
      

      【讨论】:

        【解决方案4】:

        这是一个产生嵌套列表的解决方案:

        item_list <- lapply(unique(id), function(i)
                           list(id=i,item=input_frame$item[id==i]) )
        

        您可以通过

        访问例如id==2 的项目
        item_list[[2]]$item
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-02
          • 1970-01-01
          • 2018-10-31
          • 1970-01-01
          相关资源
          最近更新 更多