应用 ifelse 语句并且 is.na 不 'sum' 但输出矩阵 - 我的逻辑错误在哪里?

apply with ifelse statement and is.na does not 'sum' but outputs matrix - where is my logical mistake?

可能是个愚蠢的问题,但我显然看不懂,非常感谢您的帮助。

这是一个虚构的数据集:

dat <- data.frame(ID = c(101, 202, 303, 404),
                  var1 = c(1, NA, 0, 1),
                  var2 = c(NA, NA, 0, 1))

现在我需要创建一个变量来汇总每个主题的值。以下工作但在 var1 和 var2 为 NA 时忽略:

try1 <- apply(dat[,c(2:3)], MARGIN=1, function(x) {sum(x==1, na.rm=TRUE)})

如果 var1 和 var2 都是 NA,我希望脚本写入 NA,但如果两个变量之一具有实际值,我希望脚本将 NA 视为 0。我试过这个:

check1 <- apply(dat[,2:3], MARGIN=1, function(x) 
{ifelse(x== is.na(dat$var1) & is.na(dat$var2), NA, {sum(x==1, na.rm=TRUE)})})

但是,这会生成一个 4x4 矩阵 (int[1:4,1:4])。真实的数据集有数百个观察结果,所以变得一团糟……有人看到我哪里出错了吗?

谢谢!

这是一个工作版本:

apply(dat[,2:3], MARGIN=1, function(x) 
  {
    if(all(is.na(x))) {
      NA
    } else {
      sum(x==1, na.rm=TRUE)
    }
  }
)
#[1]  1 NA  0  2

你的问题:

  • 在您的 function(x) 中,x 是特定行的 var1var2 值。您不想返回并引用 dat$var1dat$var2,这是整个专栏!只需使用 x.
  • x== is.na(dat$var1) & is.na(dat$var2)很奇怪。它正在尝试检查 x 是否与 is.na(dat$var1) 相同?
  • 对于给定的行,我们要检查是否所有值都是 NAifelse 是矢量化的,并且 return 是一个矢量 - 但我们不需要矢量,我们想要一个 TRUEFALSE 来指示是否所有值都是 NA.所以我们使用 all(is.na())if() 而不是 ifelse.