【问题标题】:Consolidate duplicate rows合并重复行
【发布时间】:2012-04-16 19:08:58
【问题描述】:

我有一个数据框,其中一列是物种名称,第二列是丰度值。由于抽样程序,一些物种出现不止一次(即,其中有不止一行包含物种 X)。我想合并这些条目并总结它们的丰富性。

例如,给定这个数据框:

set.seed(6)
df=data.frame(
  x=c("sp1","sp2","sp3","sp3","sp4","sp2","sp3"),
  y=rpois(7,2)); df

产生:

    x y
1 sp1 2
2 sp2 4
3 sp3 1
4 sp3 1
5 sp4 3
6 sp2 5
7 sp3 5

我想改为:

    x y
1 sp1 2    
2 sp2 9     (5+4)
3 sp3 7     (5+1+1)
5 sp4 3

提前感谢您提供的任何帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    这行得通:

    library(plyr)
    ddply(df,"x",numcolwise(sum))
    

    用词:(1)将数据框df"x"列拆分; (2) 对于每个块,取每个数值列的总和; (3) 将结果粘贴回单个数据框中。 (dd in ddply 代表“取一个d ata帧作为输入,返回一个d ata帧”)

    另一种可能更清晰的方法:

    aggregate(y~x,data=df,FUN=sum)
    

    请参阅quick/elegant way to construct mean/variance summary table 了解相关(稍微复杂一点)的问题。

    【讨论】:

    • 天啊!这个 ddply 的教科书应用程序是如何从我身边溜走的……谢谢 Ben!
    • +1 用于 numcolwise 和 sum 的应用。我一直在忙着变换和变异,试图让它完全正常工作。
    • AFAIK, "aggregate(y~x+z,data=df,FUN=sum)" 可用于保留 additional 列(此处为“z”),是否有需要(在我的情况下是需要)。如果我错了,请纠正我。
    【解决方案2】:

    简单如aggregate:

    aggregate(df['y'], by=df['x'], sum)
    

    【讨论】:

      【解决方案3】:

      dplyr 解决方案:

      library(dplyr)
      df %>% group_by(x) %>% summarise(y = sum(y))
      

      【讨论】:

        【解决方案4】:

        data.table 的时间和内存效率解决方案

        library(data.table)
        DT <- as.data.table(df)
        # which columns are numeric 
        numeric_cols <- which(sapply(DT, is.numeric))
        DT[, lapply(.SD, sum), by = x, .SDcols = numeric_cols]
        

        或者,在您的情况下,假设您知道只有 1 列 y 您希望求和

        DT[, list(y=sum(y)),by=x]
        

        【讨论】:

          【解决方案5】:
          > tapply(df$y, df$x, sum)
          sp1 sp2 sp3 sp4 
            2   9   7   3 
          

          如果它必须是data.frame Ben 的回答效果很好。或者你可以强制tapply输出。

          out <- tapply(df$y, df$x, sum)
          >     data.frame(x=names(out), y=out, row.names=NULL)
              x y
          1 sp1 2
          2 sp2 9
          3 sp3 7
          4 sp4 3
          

          【讨论】:

            【解决方案6】:

            一个 MWE 来验证一个公式是否尊重第二个变量(即这里的“Z”以及“X”之外的其他变量是否真的有效:

            example = data.frame(X=c("x"),Z=c("a"),Y=c(1), stringsAsFactors=F)
            newrow = c("y","b",1)
            example <- rbind(example, newrow)
            newrow = c("z","a",0.5)
            example <- rbind(example, newrow)
            newrow = c("x","b",1)
            example <- rbind(example, newrow)
            newrow = c("x","b",2)
            example <- rbind(example, newrow)
            newrow = c("y","b",10)
            example <- rbind(example, newrow)
            example$X = as.factor(example$X)
            example$Z = as.factor(example$Z)
            example$Y = as.numeric(example$Y)
            example_agg <- aggregate(Y~X+Z,data=example,FUN=sum)
            

            【讨论】:

              猜你喜欢
              • 2012-07-15
              • 2014-03-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-02
              相关资源
              最近更新 更多