R中重复行之间的平均值

wnrlj8wa  于 2023-01-15  发布在  其他
关注(0)|答案(5)|浏览(331)

我有一个数据框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

我需要将重复的名称聚合到一行中,同时计算values列的平均值。预期输出如下:

name    value   etc1    etc2
A       10      1       X
B       2       1       Y
C       45      1       Y

我试过使用df[duplicated(df$name),],但当然这不能给予我重复项的平均值。我想使用aggregate(),但问题是这个函数的FUN部分也将应用于所有其他列,并且除了其他问题外,它将无法计算char内容。由于所有其他列在“重复项”上都具有相同的内容,我需要他们被聚合,就像名称列。任何提示...?

inkz8wg9

inkz8wg91#

这里是一个data.table的解决方案。这个解决方案是通用的,即使是一个有60列的数据框架也能工作。因为我把数据按所有变量的不同值进行了分组(见下面我是如何创建键的)

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

EDIT扩展到多个 value 变量

如果您有多个数值变量要计算平均值,例如,如果您的数据如下所示

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

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

qpgpyjmq

qpgpyjmq2#

您可以使用aggregate()函数,如下所示:

aggregate(df$value,by=list(name=df$name,etc1=df$etc1,etc2=df$etc2),data=df,FUN=mean)
8dtrkrch

8dtrkrch3#

代码(由Metrics编写)几乎可以正常工作,除了一个地方(.name)。

sample<- structure(list(name = structure(c(1L, 1L, 1L, 2L, 3L, 3L), .Label = c("A", 
    "B", "C"), class = "factor"), value = c(9L, 10L, 11L, 2L, 40L, 
    50L), etc1 = c(1L, 1L, 1L, 1L, 1L, 1L), etc2 = structure(c(1L, 
    1L, 1L, 2L, 2L, 2L), .Label = c("X", "Y"), class = "factor")), .Names = c("name", 
    "value", "etc1", "etc2"), class = "data.frame", row.names = c(NA, 
    -6L))

sample.m <- ddply(sample, 'name', summarize, value =mean(value), etc1=head(etc1,1), etc2=head(etc2,1))

sample.m
      name value etc1 etc2
    1    A    10    1    X
    2    B     2    1    Y
    3    C    45    1    Y
tp5buhyn

tp5buhyn4#

假设你的 Dataframe 是df。

install.packages("plyr")
library(plyr)


df<- structure(list(name = structure(c(1L, 1L, 1L, 2L, 3L, 3L), .Label = c("A", 
    "B", "C"), class = "factor"), value = c(9L, 10L, 11L, 2L, 40L, 
    50L), etc1 = c(1L, 1L, 1L, 1L, 1L, 1L), etc2 = structure(c(1L, 
    1L, 1L, 2L, 2L, 2L), .Label = c("X", "Y"), class = "factor")), .Names = c("name", 
    "value", "etc1", "etc2"), class = "data.frame", row.names = c(NA, 
    -6L))

df.m<-ddply(df,.(name),summarize, value=mean(value),etc1=head(etc1,1),etc2=head(etc2,1))

df.m
 name value etc1 etc2
1    A      10    1    X
2    B       2    1    Y
3    C      45    1    Y
jk9hmnmh

jk9hmnmh5#

这个简单的方法对我很有效:
平均值_数据〈-聚合(. ~名称,df,平均值)
使用“聚合”函数:根据命名变量(“name”),在数据.frame“df”中对所有变量(.)应用公式方法(x ~ y),以执行“mean”功能。

相关问题