首页 > 解决方案 > 与 ifelse 语句一起应用,并且 is.na 不是“求和”而是输出矩阵 - 我的逻辑错误在哪里?

问题描述

可能是一个愚蠢的问题,但我显然看不到它,并感谢您的帮助。

这是一个虚构的数据集:

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])。真实的数据集有数百个观察结果,所以变得一团糟......有人知道我哪里出错了吗?

谢谢!

标签: rfunctionsumintegerapply

解决方案


这是一个工作版本:

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中是特定行的var1和值。var2你不想回去参考dat$var1and dat$var2,这是整个专栏!只需使用x.
  • x== is.na(dat$var1) & is.na(dat$var2)很奇怪。它试图检查是否xis.na(dat$var1)?
  • 对于给定的行,我们要检查是否所有的值都是NA. ifelse被矢量化并将返回一个矢量 - 但我们不想要一个矢量,我们想要一个TRUEFALSE指示所有值是否都是NA. 所以我们使用all(is.na()). 而if()不是ifelse.

推荐阅读