R语言如何判断数据框任意列含1并生成对应虚拟变量新列
原代码存在的问题
- 代码中没有定义
x对象,any(x == 1)的判断完全没有关联数据框中的实际数据 %in%属于集合匹配操作符,原写法逻辑是判断单个全局逻辑值是否存在于整个数据框中,没有实现逐行扫描列值的需求any()函数默认对传入的全部数据做全局判断,不做逐行适配的话只会返回单个TRUE/FALSE值,最终新增列的所有行都会被填充为同一个结果- R内置的查看数据框函数为
View()(首字母大写),小写view()不是基础R默认函数,运行会直接报错
可直接运行的方案
基础R实现(无需安装任何扩展包,运行效率最高)
用行求和的方式做判断,对你这个238行的小数据集来说运行速度极快:
# 逐行统计值等于1的单元格数量,计数大于0则标记为yes,否则标记为no # 参数na.rm = TRUE的作用是跳过缺失值NA避免计算报错,如果你的数据没有缺失值可以删掉这个参数 df$dummy <- ifelse(rowSums(df == 1, na.rm = TRUE) > 0, "yes", "no") # 查看处理完成的数据框 View(df)
核心逻辑:df == 1会先把整个数据框转换为布尔值矩阵,每个位置对应当前单元格的值是否等于1,rowSums逐行统计布尔值为TRUE的数量,只要计数大于0就说明该行至少有一列的值为1。
dplyr实现(适配tidyverse语法习惯)
如果你平时习惯用dplyr的管道语法做数据处理,可以用逐行计算的写法:
library(dplyr) df <- df %>% rowwise() %>% mutate( dummy = ifelse(any(c_across(everything()) == 1, na.rm = TRUE), "yes", "no") ) %>% ungroup() View(df)
内容的提问来源于stack exchange,提问作者sweatcrepe
相关产品推荐
相关产品推荐

