R语言中用ifelse合并data.frame多健康变量遇问题求助
解决多条件合并变量的问题
嘿,我明白你遇到的困扰了——其实R完全支持多个|(或)逻辑语句,问题出在你写的ifelse语法上哦!
先修正你的原始代码
你当前的ifelse第一个参数写的是dataset,但ifelse要求第一个参数必须是逻辑向量(也就是你的条件判断结果),正确的写法应该是把所有或条件放在第一个参数的位置:
# 即使加更多条件,这样写语法上是成立的,只是变量多了会很冗长 dataset$one <- ifelse( (dataset$a == 1) | (dataset$b == 1) | (dataset$c == 1) | (dataset$d == 1) | (dataset$e == 1) | (dataset$f == 1) | (dataset$g == 1) | (dataset$h == 1) | (dataset$i == 1) | (dataset$j == 1), 1, 0 )
更简洁高效的方法(推荐)
当需要判断的变量多达10个时,写一堆|不仅麻烦还容易漏写,推荐用以下两种更优雅的方式:
方法1:用rowSums(适用于变量是0/1编码的情况)
如果你的a到j都是0/1的二进制变量,直接计算每行的和,只要和大于0就说明存在至少一个目标状况:
# 先列出所有需要判断的变量名 target_vars <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j") # 生成新变量:行和>0则为1,否则为0 dataset$one <- as.integer(rowSums(dataset[target_vars]) > 0)
方法2:用apply+any
这种方法更通用,哪怕变量不是0/1(比如是TRUE/FALSE或者其他标记)也能使用:
target_vars <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j") # 对每行检查是否有等于1的变量,再转成1/0 dataset$one <- as.integer(apply(dataset[target_vars] == 1, 1, any))
为什么你的原始代码失效?
你把ifelse的第一个参数写成了整个dataset,这会导致R尝试把整个数据框转换成逻辑值,这显然不符合ifelse的要求,所以当条件变多后就会报错或得到错误结果。只要把第一个参数换成正确的逻辑条件集合,多|语句是完全支持的~
内容的提问来源于stack exchange,提问作者user9340114
相关产品推荐
相关产品推荐

