R中重复行之间的平均值

bio*_*ard 9 aggregate r duplicates mean

我有一个数据框df,其行与名称列重复,但不是值列的重复:

name    value   etc1    etc2
A       9       1       X
A       10      1       X
A       11      1       X
B       2       1       Y
C       40      1       Y
C       50      1       Y
Run Code Online (Sandbox Code Playgroud)

我需要将重复的名称聚合成一行,同时计算值列的平均值.预期产量如下:

name    value   etc1    etc2
A       10      1       X
B       2       1       Y
C       45      1       Y
Run Code Online (Sandbox Code Playgroud)

我试过用,df[duplicated(df$name),]但当然这并没有给我重复的意思.我想使用aggregate(),但问题是此函数的FUN部分也将适用于所有其他列,并且除了其他问题之外,它将无法计算char内容.由于所有其他列都具有与"重复"相同的内容,因此我需要将它们聚合,就像名称列一样.任何提示......?

ags*_*udy 11

这是一个data.table解决方案 解决方案是通用的,即使对于具有60列的data.frame也是如此.因为我按所有不同值的变量对数据进行分组(请参阅下面的创建键)

library(data.table)
dat <- read.table(text='name    value   etc1    etc2
A       9       1       X
A       10      1       X
A       11      1       X
B       2       1       Y
C       40      1       Y
C       50      1       Y',header=TRUE)
keys <- colnames(dat)[!grepl('value',colnames(dat))]
X <- as.data.table(dat)
X[,list(mm= mean(value)),keys]
  name etc1 etc2 mm
1:    A    1    X 10
2:    B    1    Y  2
3:    C    1    Y 45
Run Code Online (Sandbox Code Playgroud)

编辑扩展到多个变量

如果您有多个要计算平均值的数值变量,例如,如果您的数据看起来像这样

  name value etc1 etc2     value1
1    A     9    1    X  2.1763485
2    A    10    1    X -0.7954326
3    A    11    1    X -0.5839844
4    B     2    1    Y -0.5188709
5    C    40    1    Y -0.8300233
6    C    50    1    Y -0.7787496
Run Code Online (Sandbox Code Playgroud)

上述解决方案可以像这样扩展:

X[,lapply(.SD,mean),keys]
   name etc1 etc2 value     value1
1:    A    1    X    10  0.2656438
2:    B    1    Y     2 -0.5188709
3:    C    1    Y    45 -0.8043865
Run Code Online (Sandbox Code Playgroud)

这将计算键列表中不存在的所有变量的均值.


小智 7

您可以使用aggregate()以下功能:

aggregate(df$value,by=list(name=df$name,etc1=df$etc1,etc2=df$etc2),data=df,FUN=mean)
Run Code Online (Sandbox Code Playgroud)