合并重复的行

jsl*_*che 35 r

我有一个数据框,其中一列是物种的名称,第二列是丰度值.由于采样程序,一些物种出现不止一次(即,其中有多个物种,其中有物种X).我想巩固这些条目并总结它们的丰富程度.

例如,给定此数据框:

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

产生:

    x y
1 sp1 2
2 sp2 4
3 sp3 1
4 sp3 1
5 sp4 3
6 sp2 5
7 sp3 5
Run Code Online (Sandbox Code Playgroud)

我想改为:

    x y
1 sp1 2    
2 sp2 9     (5+4)
3 sp3 7     (5+1+1)
5 sp4 3
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ker 46

这有效:

library(plyr)
ddply(df,"x",numcolwise(sum))
Run Code Online (Sandbox Code Playgroud)

用文字表示:(1)df"x"列拆分数据框; (2)对于每个块,取每个数值列的总和; (3)将结果粘贴回单个数据框.(ddddply代表"采取d ATA帧作为输入,返回一个d ATA帧")

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

aggregate(y~x,data=df,FUN=sum)
Run Code Online (Sandbox Code Playgroud)

请参阅快速/优雅的方法来构建相关(稍微复杂)问题的均值/方差汇总表.

  • AFAIK,"聚合(y~x + z,data = df,FUN = sum)"可用于保留*附加*列(此处为"z"),如果有需要(在我的情况下需要) .如果我错了,请纠正我. (2认同)

Jos*_*ich 23

简单如下aggregate:

aggregate(df['y'], by=df['x'], sum)
Run Code Online (Sandbox Code Playgroud)


Car*_*lli 9

一个dplyr解决方案:

library(dplyr)
df %>% group_by(x) %>% summarise(y = sum(y))
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 8

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]
Run Code Online (Sandbox Code Playgroud)

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

DT[, list(y=sum(y)),by=x]
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 6

> tapply(df$y, df$x, sum)
sp1 sp2 sp3 sp4 
  2   9   7   3 
Run Code Online (Sandbox Code Playgroud)

如果它必须是data.frameBen的答案很有效.或者你可以强制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
Run Code Online (Sandbox Code Playgroud)