r - 按年份聚合数据并仅当该年份的列中的值时覆盖行中的 NA

标签 r dataframe aggregate reshape na

假设我有数据框:

 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/

相关文章:

python - 在循环中按索引对列表中的元素求和

python - 如何在 MultiIndexed Datarfame 中对一个索引大于 X 的所有值求和,并根据其他索引进行分组?

r - 如何避免在函数中重复代码以使用ggplot2绘制密度直方图和简单直方图?

python - 如何在DataFrame中找到相同的行——python

r - 在 map 上绘制坐标

删除R中一列中带有数字的行

python - 为 'group number' 和 '0' s 的 pandas 数据框列创建 '1' 列

java - 使用 SqlPredicate 聚合时出现 Hazelcast 错误

r - 识别变量的所有可能组合,包括 R 中是否缺少值

javascript - 在 Chrome 中重新加载动画 GIF 时出现问题