假设我有数据框:
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。此外,如果像第2年var 3所示的列只有一个NA,则NA必须保留。
答案 0 :(得分:2)
在基数R中,可以使用split/lapply
完成。
res <- lapply(split(dfTest, dfTest$year), function(DF){
c(year = unique(DF[["year"]]),
meanVal = unique(DF[["meanVal"]]),
colMeans(DF[3:5], na.rm = TRUE)
)
})
res <- do.call(rbind, res)
is.na(res) <- is.nan(res)
res
# year meanVal var1 var2 var3
#1 1 1 1 1 1
#2 2 2 2 2 NA
#3 3 3 3 3 3
答案 1 :(得分:2)
我们也可以使用aggregate
中的base R
进行此操作。创建一个函数来照顾每个组只有一行(或具有all
NA的多行)并且这是一个缺失值的情况。与mean
配合使用时,NaN
的默认方法返回na.rm = TRUE
aggregate(.~ year, dfTest, mean, na.rm = TRUE, na.action = NULL)
为避免获取NaN
,请创建函数(f1
),该函数检查每个组中特定列的all
元素是否为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