【问题标题】:Mean by levels of factor in R, append as new column [duplicate]R中因子水平的平均值,附加为新列[重复]
【发布时间】:2015-02-20 10:01:56
【问题描述】:

我担心可能是一个简单的问题,我几乎有解决方案(确实,我确实有解决方案,但它很笨拙)。

我有一个数据框如下:

name    replicate   value
A   1   0.9
A   2   1
B   1   0.8
B   2   0.81
C   1   0.7
C   2   0.9

我想做的是通过“名称”计算“值”的平均值,并将结果附加到新列,如下所示:

name    replicate   value   meanbyname
A   1   0.9 0.95
A   2   1   0.95
B   1   0.8 0.805
B   2   0.81    0.805
C   1   0.7 0.8
C   2   0.9 0.8

我可以通过以下任何一种方式计算均值:

a<-aggregate(value~name, data=test, FUN=function(x) c(mean=mean(x),count=length(x)))
b<-aggregate(test$value~test$name, FUN=mean)
c<-tapply(test$value, test$name, mean)

但我无法轻松地将它们附加到数据框中,因为它们的长度错误。

然后我可以这样做:

 test$meanbyname<-rep(c, each=2)

这似乎很接近,因为对象“a”似乎只有两列宽:

  test$meanbyname<-rep(a$value.mean, each=a$value.count)

我想要一种自动化流程的方法,例如,如果存在 name=A 的三个副本且 name=B 只有一个副本,它将起作用。是否有更通用的单线解决方案?

提前感谢大家的帮助。

【问题讨论】:

    标签: r apply mean


    【解决方案1】:

    您可以使用 ave 中的 base R

     test$meanbyname <- with(test, ave(value, name))
    

    或者使用mutate from dplyr or := in data.table,可以得到结果

     library(dplyr)
     group_by(test, name) %>% 
                   mutate(meanbyname=mean(value))
    

    或者

     library(data.table)
     setDT(test)[, meanbyname:= mean(value), by=name]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2018-12-07
      • 1970-01-01
      相关资源
      最近更新 更多