替换函数中data.frame中的值(与apply一起使用)

时间:2019-10-15 17:08:00

标签: r

我有一个像这样的data.frame:

type EnumMap<T extends string> = { [key in T]: string}

所以每个组可能有不同的年份。我想用各自年份的平均值代替那些NA。例如,对于第3行中的NA,2007年将其替换为A组的平均值。

我可以使用for循环来做到这一点,但是不幸的是,我的教授讨厌“ for”循环,因此我正在尝试寻找另一种方法。我尝试使用这样的功能: GROUP | YEAR | VAL A | 2007 | 10 A | 2007 | 11 A | 2007 | NA A | 2008 | 13 B | 2006 | NA B | 2006 | 5 B | 2006 | 6 ,需要用组和年份来计算平均值,然后对data.frame进行变异。然后,我将此功能应用于要替换的组和年份的data.frame。

不幸的是,R没有传递引用,这意味着我不能直接在imputeMean(group,year)函数中修改原始data.frame。无论如何,有没有在不使用循环的情况下计算出一个data.frame过滤器,计算相对于年份的组均值并用该均值替换NA值?

2 个答案:

答案 0 :(得分:1)

按“ GROUP”,“ YEAR”分组后,我们可以使用na.aggregate

library(dplyr)
library(zoo)
df1 %>%
    group_by(GROUP, YEAR) %>%
    mutate(VAL = na.aggregate(VAL))

答案 1 :(得分:1)

另一种dplyr解决方案:

library(dplyr)

df1 %>%  
  group_by(GROUP, YEAR) %>%
  mutate_at(vars(VAL) , list(~ifelse(is.na(.), mean(., na.rm = TRUE),.)))

#   GROUP  YEAR   VAL
# 1 A      2007  10  
# 2 A      2007  11  
# 3 A      2007  10.5
# 4 A      2008  13  
# 5 B      2006   5.5
# 6 B      2006   5  
# 7 B      2006   6