r - R 中返回 NA 的 %in% 的优雅版本?
问题描述
因此,我对这段 R 代码第三行的行为感到惊讶:
x <- c(1, 2, 3, 4, NA, 5, 6, 7, 8)
ifelse(x < 4, 1, 0)
ifelse(x %in% 1:3, 1, 0)
它返回1,1,1,0,0,0,0,0,0
的不是1,1,1,0,NA,0,0,0,0
我认为我会得到的,即与第二行相同。仔细检查帮助文件%in%
并match
显示这是记录在案的行为,返回:
“一个逻辑向量,指示是否为 x 的每个元素找到匹配项:因此值是 TRUE 或 FALSE,从不 NA。”
%in%
除了在这种情况下会给出 NA 之外,是否有一个类似于的通用函数?例如,这将返回所需的结果:
`%inna%` <- function(x, table){
y <- match(x, table, nomatch = 0) > 0
y[is.na(x)] <- NA
return(y)
}
ifelse(x %inna% 1:3, 1, 0)
但是有没有一种通用的方法来做到这一点?
解决方案
我们可以通过使用生成NA
的乘法来替换NA
is.na(x)
(x %in% 1:3) * NA^(is.na(x))
#[1] 1 1 1 0 NA 0 0 0 0
或使用replace
replace(+(x %in% 1:3), is.na(x), NA)
#[1] 1 1 1 0 NA 0 0 0 0
可以转换成函数
`%inna%` <- function(x, table) {
replace(as.integer(x %in% table), is.na(x), NA)
}
x %inna% 1:3
#[1] 1 1 1 0 NA 0 0 0 0
推荐阅读
- smtp - 如何更改或覆盖 Google Composer Airflow 的 smtp_password
- ruby - 我的 ruby while 循环没有给我任何输出作为数字数组
- docker - 在 docker build 中等待连接时请求被取消
- php - 如何在 Laravel 中为 eloquent 执行 1 到多个更新功能?
- excel - 如果一列或两列都没有填满,有没有办法计算?
- openedge - 如何更改 OpenEdge Progress 中 DATE 变量的默认格式?
- python - 如何在使用 python 进行正则表达式搜索后打印下一行
- c - 将动态规划集成到递归解决方案中
- verilog - 在一个模块中看到 X 的值
- php - 联合中重复记录的总和