r - 与 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])。真实的数据集有数百个观察结果,所以变得一团糟......有人知道我哪里出错了吗?
谢谢!
解决方案
这是一个工作版本:
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
anddat$var2
,这是整个专栏!只需使用x
. x== is.na(dat$var1) & is.na(dat$var2)
很奇怪。它试图检查是否x
与is.na(dat$var1)
?- 对于给定的行,我们要检查是否所有的值都是
NA
.ifelse
被矢量化并将返回一个矢量 - 但我们不想要一个矢量,我们想要一个TRUE
或FALSE
指示所有值是否都是NA
. 所以我们使用all(is.na())
. 而if()
不是ifelse
.
推荐阅读
- java - 如何返回没有前 2 个字符的字符串?
- assembly - 汇编 x86 imul 误解
- swift - cgpoint 的颜色会更改所有行,并且应该只更改新行
- python - 为什么在没有 init 的情况下使用顶级目录的导入在 Python 中工作?
- python - gRPC:从装饰器或 ServiceInterceptor 将属性添加到上下文
- oracle - 事实表中的事实值或度量是什么意思?
- java - IE11 和 Safari 没有将授权标头传递给后端
- split - 如何分割线并在lua中获取模式?
- python - python中classmethod wrapper的函数定义
- html - 字体不显示的问题