我有一个数据框 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
我需要将重复的名称聚合为一行,同时计算值列的平均值。预期输出如下:
name value etc1 etc2
A 10 1 X
B 2 1 Y
C 45 1 Y
我曾尝试使用
df[duplicated(df$name),]
但当然这并没有给我重复的意思。我想用 aggregate()
,但问题是此函数的 FUN 部分也将适用于所有其他列,并且除其他问题外,它无法计算字符内容。由于所有其他列在“重复项”上具有相同的内容,因此我需要将它们聚合为就像名称列一样。任何提示...?
最佳答案
这里有一个 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
编辑 扩展到多个值变量
如果您有多个数值变量要计算均值,例如,如果您的数据如下所示
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
上面的解决方案可以这样扩展:
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
这将计算键列表中不存在的所有变量的平均值。
关于r - R中重复行之间的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17383635/