R语言如何将数据框多个二值列转换为单个字符列
R数据框多二值列转单字符拼接列实现方案
你需要实现的是按行识别取值为1的outcome_*列,提取列名对应的编号拼接为逗号分隔的字符列,以下是两种可直接运行的实现方式:
基础R实现(无需加载第三方包)
# 构造示例源数据 id <- c(1,2,3) outcome_1 <- c(1,0,1) outcome_2 <- c(1,1,0) df1 <- data.frame(id,outcome_1,outcome_2) # 提取所有结果列 outcome_col_names <- grep("^outcome_", names(df1), value = TRUE) # 逐行拼接阳性结果 df2 <- data.frame( id = df1$id, outcome = apply(df1[outcome_col_names], 1, function(row_val) { # 筛选当前行值为1的列,提取编号后拼接 hit_names <- names(row_val)[row_val == 1] paste(gsub("outcome_", "", hit_names), collapse = ",") }), stringsAsFactors = FALSE )
运行后得到的df2与目标结构完全一致:
id outcome 1 1 1,2 2 2 2 3 3 1
Tidyverse实现(适配管道工作流)
如果日常使用tidyverse生态处理数据,可以用长宽表转换的逻辑实现,代码可读性更高:
library(dplyr) library(tidyr) df2 <- df1 |> pivot_longer( cols = starts_with("outcome_"), names_to = "outcome_tag", values_to = "flag" ) |> filter(flag == 1) |> mutate(outcome_tag = gsub("outcome_", "", outcome_tag)) |> summarise( outcome = paste(outcome_tag, collapse = ","), .by = id )
注意:两种方案输出的
outcome列均为字符类型,若某行所有结果列取值为0,对应outcome会返回空字符串,可根据实际需求调整空值填充规则。
内容的提问来源于stack exchange,提问作者marc.th
相关产品推荐
相关产品推荐

