【问题标题】:A loop for calculating mean by group and ignore the NA用于按组计算平均值并忽略 NA 的循环
【发布时间】: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

标签: r loops dataframe mean


【解决方案1】:

我试图保留您的代码,但在for 循环中做了一些小改动,尤其是old &lt;- paste0("old", i) 行。现在我猜你想要的可能如下所示:

for (i in 1:4) {
  old <- eval(parse(text = paste0("df$old", i))) 
  df[[paste0("new", i)]] <- with(df, ave(as.numeric(as.character(old)),df$groupID, FUN=function(x)mean(x, na.rm = T)))
}

这样

> df
  old1 old2 old3 old4 groupID new1 new2 new3     new4
1   20   20   20   20       1 20.5 20.5 21.0 25.33333
2   21   21   22   25       1 20.5 20.5 21.0 25.33333
3 <NA> <NA> <NA>   31       1 20.5 20.5 21.0 25.33333
4   30   30   30 <NA>       2 30.5 32.5 30.5 44.00000
5   31   35   31   44       2 30.5 32.5 30.5 44.00000

【讨论】:

    猜你喜欢
    • 2020-03-27
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2021-04-16
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多