假设我有数据框:
dfTest <- data.frame(year = c(1,2,3,1,3),
meanVal = c(1,2,3,1,3),
var1 = c(1,2,3,1,3),
var2 = c(NA,2,NA,1,3),
var3 = c(1,NA,NA,1,3))
> dfTest
year meanVal var1 var2 var3
1 1 1 1 NA 1
2 2 2 2 2 NA
3 3 3 3 NA NA
4 1 1 1 1 1
5 3 3 3 3 3
我需要什么:
> dfTest
year meanVal var1 var2 var3
1 1 1 1 1 1
2 2 2 2 2 NA
3 3 3 3 3 3
要实现这一点,行需要按年折叠。如果某列存在 NA,则应替换为该列中的值。即第 1 年 (1) 的 var1 只有 1 个值。然而,var1 列中的某些行可能具有 NA。此外,如果像我们在 Year 2 var 3 中看到的那样,列只有 NA,则 NA 必须保留。
最佳答案
我们还可以使用base R
中的aggregate
来做到这一点。创建一个函数来处理每个组只有一行(或多行全部
NA)且缺少值的情况。当应用 na.rm = TRUE
mean
的默认方法返回 NaN
aggregate(.~ year, dfTest, mean, na.rm = TRUE, na.action = NULL)
为避免获得 NaN
,请创建函数 (f1
) 来检查所有
元素是否为 NA
对于每组的特定列。通过 if/else
,我们可以针对这些情况返回 NA
。
f1 <- function(x) if(all(is.na(x))) NA else mean(x, na.rm = TRUE)
aggregate(.~ year, dfTest, f1, na.action = NULL)
# year meanVal var1 var2 var3
#1 1 1 1 1 1
#2 2 2 2 2 NA
#3 3 3 3 3 3
关于r - 按年份聚合数据并仅当该年份的列中的值时覆盖行中的 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53823777/