我定期在 R 中创建数据集,并且经常发现我需要将两个或多个二进制变量“或”放入一个新变量中,以指示是否有任何为 1、没有为 1 或全部丢失。简单地使用|
并不能NA
按照我想要的方式处理。
因此,给定一个包含df
三列的 data.frame :
x = c( 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,NA,NA,NA,NA,NA,NA,NA,NA,NA)
y = c( 0, 0, 0, 1, 1, 1,NA,NA,NA, 0, 0, 0, 1, 1, 1,NA,NA,NA, 0, 0, 0, 1, 1, 1,NA,NA,NA)
z = c( 0, 1,NA, 0, 1,NA, 0, 1,NA, 0, 1,NA, 0, 1,NA, 0, 1,NA, 0, 1,NA, 0, 1,NA, 0, 1,NA)
df = data.frame(x,y,z)
我正在寻找的输出是:
myFunction(df)
[1] 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 NA
但是简单地使用|
并不能像我正在寻找的那样处理 0,因为它优先考虑NA
's over 0's:
as.numeric(df$x | df$y | df$z)
[1] 0 1 NA 1 1 1 NA 1 NA 1 1 1 1 1 1 1 1 1 NA 1 NA 1 1 1 NA 1 NA
这是我想出的最佳解决方案:
myFunction <- function(...) {
as.numeric(apply(data.frame(...),1,function(x) { ifelse(all(is.na(x)),NA,sum(x,na.rm = T)) }) > 0)
}
df$xyz = myFunction(df)
df$xyz
[1] 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 NA
是否有具有此功能的程序包或编写此程序的更好方法,以便我不必在所有脚本中复制粘贴这些乱七八糟的东西?我是不是想多了?
我们可以使用rowSums
并转换为二进制
df$new_col <- +(rowSums(df, na.rm = TRUE) > 0) * NA^(!rowSums(!is.na(df)))
-输出
df$new_col
[1] 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 NA
如果我们使用sum_
from,也可以以紧凑的方式hablar
library(hablar)
+(apply(df, 1, sum_) > 0)
[1] 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 NA
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句