我有一个像这样的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值?
答案 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