在 R 中编写一个包含 if/else 语句和 rowSums() 的函数,定义如何处理 NA

法巴

我一直在寻找答案并尝试所有我能想到的,但没有任何效果:

我想编写一个函数数据帧中的行添加值编写函数是最容易的,因为我有很多列,而且不必总是添加相同的列。这是一个数据框的示例:

ExampleData <- data.frame(Participant = 1:7,
                   Var1 = c(2, NA, 13, 15, 0, 2, NA),
                   Var2 = c(NA, NA, 1, 0, NA, 4, 2),
                   Var3 = c(6, NA, 1, 0, 1, 5, 3),
                   Var4 = c(12, NA, NA, 4, 10, 1, 4),
                   Var5 = c(10, NA, 3, 5, NA, 4, 4))

条件:如果一行中的所有值都是 NA,则总和应该是 NA。如果一行中至少有一个值为数字(>= 0,或不是 NA),则 rowSums 应忽略 NA 并添加这些值。

到目前为止,我达到的最佳解决方案是:

addition <- function(x) {
  if(all(is.na(x))){
       NA
  }else{
       rowSums(x, na.rm = TRUE)
  }
}
addition(ExampleData[, c("Var1", "Var2", "Var3")])

输出是: [1] 8 0 15 15 1 11 5

但它应该是: [1] 8 NA 15 15 1 11 5

有谁知道如何做到这一点?谢谢你。

阿克伦

原因是all(is.na(x))检查数据集的所有元素是否都是 NA 而不是按行。如果我们检查 的输出is.na(data),它是一个合乎逻辑的matrixAmatrix基本上是vector具有维度属性的 a。因此,用all检查是否所有元素都是 NA 来包装

例如,

all(is.na(matrix(c(1:9, NA), 5, 2)))
#[1] FALSE

我们可以将函数更改为

 addition <- function(x) {
     rowSums(x, na.rm = TRUE) *  NA^(rowSums(!is.na(x))==0)

 }
addition(ExampleData[, c("Var1", "Var2", "Var3")])
#[1]  8 NA 15 15  1 11  5

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章