如何在R语言中根据多列0/1值生成合并汇总列?
解决方案
针对你的需求,这里有两种高效的实现方式,不管变量数量多少都能直接套用,不用写繁琐的if else:
Base R 实现
先构造一个示例数据集方便测试:
df <- data.frame( var1 = c("1", "0", "1"), var2 = c("0", "1", "1"), var3 = c("0", "0", "0"), var4 = c("1", "0", "1"), stringsAsFactors = FALSE )
用apply按行遍历处理,直接生成汇总列:
df$summary <- apply(df, 1, function(row) { # 筛选出当前行值为"1"的列名 target_cols <- names(df)[row == "1"] # 无匹配时返回"None",否则用空格连接列名 if (length(target_cols) == 0) "None" else paste(target_cols, collapse = " ") })
Tidyverse 实现(dplyr + purrr)
如果你习惯用tidyverse工具链,可以这样写:
library(dplyr) library(purrr) df <- df %>% mutate(summary = pmap_chr(., ~ { current_row <- c(...) target_cols <- names(.)[current_row == "1"] if (length(target_cols) == 0) "None" else paste(target_cols, collapse = " ") }))
或者用rowwise语法更直观:
df <- df %>% rowwise() %>% mutate(summary = { # 标记当前行值为"1"的列 is_selected <- c_across(everything()) == "1" target_cols <- names(.)[is_selected] if (length(target_cols) == 0) "None" else paste(target_cols, collapse = " ") }) %>% ungroup()
注意事项
- 如果你的数据中是数值型的1和0,把代码里的
row == "1"改成row == 1即可 - 这两种方法都支持任意数量的变量,8个变量完全没问题,不用手动逐个判断
内容的提问来源于stack exchange,提问作者DW1310
相关产品推荐
相关产品推荐

