应用 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
是特定行的 var1
和 var2
值。您不想返回并引用 dat$var1
和 dat$var2
,这是整个专栏!只需使用 x
.
x== is.na(dat$var1) & is.na(dat$var2)
很奇怪。它正在尝试检查 x
是否与 is.na(dat$var1)
相同?
- 对于给定的行,我们要检查是否所有值都是
NA
。 ifelse
是矢量化的,并且 return 是一个矢量 - 但我们不需要矢量,我们想要一个 TRUE
或 FALSE
来指示是否所有值都是 NA
.所以我们使用 all(is.na())
。 if()
而不是 ifelse
.
可能是个愚蠢的问题,但我显然看不懂,非常感谢您的帮助。
这是一个虚构的数据集:
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
是特定行的var1
和var2
值。您不想返回并引用dat$var1
和dat$var2
,这是整个专栏!只需使用x
. x== is.na(dat$var1) & is.na(dat$var2)
很奇怪。它正在尝试检查x
是否与is.na(dat$var1)
相同?- 对于给定的行,我们要检查是否所有值都是
NA
。ifelse
是矢量化的,并且 return 是一个矢量 - 但我们不需要矢量,我们想要一个TRUE
或FALSE
来指示是否所有值都是NA
.所以我们使用all(is.na())
。if()
而不是ifelse
.