R 按年份聚合数据,仅当列中的值为该年份时,才覆盖行中的NA

R 按年份聚合数据,仅当列中的值为该年份时,才覆盖行中的NA,r,dataframe,reshape,na,collapse,R,Dataframe,Reshape,Na,Collapse,假设我有数据框: 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 v

假设我有数据框:

 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

要实现这一点,需要逐年减少行数。如果某列有NA,则应将其替换为该列中的值。i、 e.第1年(1)的var1只有1个值。但是,var1列中的某些行可能有NA。此外,如果像我们在第2年var 3中看到的列只有NA,则NA必须保持不变

在base R中,这可以通过
split/lappy
完成

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

res我们也可以通过
base R
中的
aggregate
来实现这一点。创建一个函数来处理以下情况:每组只有一行(或多行
all
NA),而这是一个缺少的值。
mean
的默认方法在与
na.rm=TRUE

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
f1
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