【问题标题】:collapsing rows in a data frame while merging another column value在合并另一个列值时折叠数据框中的行
【发布时间】:2013-07-17 18:24:31
【问题描述】:

我有这个数据集

d1 = data.frame(PatID=c(1,1,1,2,2,4,1,2), 
                code1=c(1,2,3,1,2,7,2,8), 
                location=c('a','b','c','d','e','f','g','h'))

我想消除重复的行(在PatID)所以

  1. 对于每个唯一的PatID,我只得到一行;
  2. 合并所有公共行的code1值,
  3. 保留任何匹配行的位置(对于第一行或最后一行 - 无关紧要)。

输出应该是:

PatID    code1    location 
1        1,2,3    a 
2        1,2,8    d 
4        7        f 

我尝试过不成功的聚合、ddply 甚至在使用 melt dcast 时遇到了困难。我是一名前 unix 程序员,但对 不熟悉。

【问题讨论】:

    标签: r r merge dataframe plyr reshape2


    【解决方案1】:

    ddply 工作正常:

    ddply(d1,.(PatID),
          summarise,
          code1 = paste(unique(code1),collapse = ','),
          location = location[1])
    
      PatID code1 location
    1     1 1,2,3        a
    2     2 1,2,8        d
    3     4     7        f
    

    哦,好吧。这是 data.table 版本:

    d2 <- as.data.table(d1)
    > d2[,list(code1 = paste(unique(code1),collapse = ','),location = location[1]),by = 'PatID']
       PatID code1 location
    1:     1 1,2,3        a
    2:     2 1,2,8        d
    3:     4     7        f
    

    【讨论】:

    • 当您使用它时,您也应该添加强制性的data.table 方法:)
    • 对于data.table(也许还有plyr,我不知道),将其保留为列表,而不是粘贴imo,即... code1 = list(unique(code1)) ...
    • 还有基础 R 的 aggregate?来吧?这个答案的精神在哪里? :) 哦,很好。 +1。
    • @eddi,data.frame/data.table 列中的列表似乎让 一些 人感到困惑,尤其是当他们尝试使用 write.csv 时用它。但是为了分析,我完全同意你的评论。
    • 哇!!! Jorans 解决方案优雅而完美地工作。我打算在晚上回来查看,希望我能得到一两个回复。几秒钟之内,我就有了解决方案。你们都太棒了!!!也非常感谢 mcuh Joran 和 Ananda 在上面的生动互动。
    【解决方案2】:

    只是为了确保基本 R 不会被完全忽略(或者让您了解这些类型问题的“plyr”和“data.table”的语法)...

    两种选择:

    选项 1:使用 ave 进行“聚合”,使用 unique 精简输出

    unique(within(d1, {
      code1 <- ave(code1, PatID, 
                   FUN=function(x) paste(unique(x), collapse = ","))
      location <- ave(location, PatID, FUN=function(x) x[1])
    }))
    #   PatID code1 location
    # 1     1 1,2,3        a
    # 4     2 1,2,8        d
    # 6     4     7        f
    

    选项 2:让 aggregatemerge 一起工作

    merge(
      aggregate(code1 ~ PatID, d1, 
              function(x) paste(unique(x), collapse = ",")),
      aggregate(location ~ PatID, d1, function(x) x[1]))
    #   PatID code1 location
    # 1     1 1,2,3        a
    # 2     2 1,2,8        d
    # 3     4     7        f
    

    我能想到的最接近的纯aggregate解决方案如下:

    aggregate(cbind(code1, as.character(location)) ~ PatID, d1, 
              function(x) cbind(paste(unique(x), collapse = ","),
                                as.character(x[1])))
    #   PatID code1.1 code1.2    V2.1 V2.2
    # 1     1   1,2,3       1 a,b,c,g    a
    # 2     2   1,2,8       1   d,e,h    d
    # 3     4       7       7       f    f
    

    它为您提供所有您感兴趣的信息,以及大量您不感兴趣的信息......

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多