R语言按行判断数据框任意列阈值并分类且保留NA值的实现问题
R语言DataFrame按行多条件分类实现方案
原代码问题
你的原有写法存在两个核心问题:
lapply(data, >=, 7)不符合R语法要求,运算符作为函数调用时需要用反引号包裹,或显式定义为匿名函数- 没有单独处理全行都是NA/NaN的场景,直接判断会把全NA行的分类结果误判为
less
基础包实现方案
直接用apply逐行判断,逻辑最直观:
# 示例数据 data <- data.frame(V1=c(1,5,7, NA), V2=c(1,5,8, NA), V3=c(3,9,10, NaN)) # 逐行分类实现 data$newCol <- apply(data, 1, function(row) { # 优先判断是否全行都是NA/NaN if (all(is.na(row))) { return(NA_character_) } # 存在任意值>=7返回more,否则返回less ifelse(any(row >= 7, na.rm = TRUE), "more", "less") })
修正Reduce+lapply的实现方案
如果你要沿用原来的Reduce思路,修正后的写法如下:
# 逐列判断元素是否>=7,再按行取或逻辑 row_meet_cond <- Reduce(`|`, lapply(data, function(x) x >= 7)) # 判断每行是否全为NA all_row_na <- apply(data, 1, function(x) all(is.na(x))) # 生成分类列 data$newCol <- ifelse(all_row_na, NA_character_, ifelse(row_meet_cond, "more", "less"))
Tidyverse简洁实现
如果使用dplyr包可以写出更简洁的代码:
library(dplyr) data <- data %>% mutate( newCol = case_when( if_all(everything(), is.na) ~ NA_character_, if_any(everything(), ~.x >= 7) ~ "more", .default = "less" ) )
运行以上任意一种方案得到的结果都和预期输出完全匹配。
内容的提问来源于stack exchange,提问作者maycca
相关产品推荐
相关产品推荐

