【发布时间】:2020-03-28 04:03:13
【问题描述】:
我想通过组 groupID 计算变量 old 的平均值来添加一个变量 new。
df <- data.frame('old'=c('20','21',NA,'30','31'), 'groupID'=c(1,1,1,2,2))
感谢这里人们的一些建议,我可以忽略 NA (na.rm=TRUE) 并获得每个组的平均值
df <- within(df, {new = ave(as.numeric(as.character(old)), groupID, FUN=function(x) mean(x, na.rm=TRUE))})
结果是这样的
df<-data.frame('old'=c('20','21',NA,'30','31'),
'groupID'=c(1,1,1,2,2),
'new'=c(20.5,20.5,20.5,30.5,30.5))
现在,我想进一步把它写成一个循环。
我们这里的df是:
df <- data.frame('old1'=c('20','21',NA,'30','31'),
'old2'=c('20','21',NA,'30','35'),
'old3'=c('20','22',NA,'30','31'),
'old4'=c('20','25',31,NA,'44'),
'groupID'=c(1,1,1,2,2))
我写的循环
for (i in 1:4){ old <- paste0("old", i) df[[paste0("new", i)]] <- with(df, ave(as.numeric(as.character(old)),df$groupID, FUN=function(x)mean(x, na.rm = T)))}
但是,我的新变量“new1-new4”全是 NaN 请帮我解决它。
【问题讨论】:
-
不清楚为什么有些值会在预期中发生变化
-
对不起,我不确定你的意思。哪个值改变了?
-
如果您按组计算平均值,为什么 old1 和 old2 的值是 20、21,组 1 是否应该相同
-
ave(as.numeric(as.character(old)) 应该反映 old1;old2 等......
-
分割循环,我想要的是:df