You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中使用dplyr/tidyverse将数据集多列合并为单列?

R tidyverse 多列合并为单列的实现方法

你可以使用tidyverse的rowwise行迭代结合列表展开操作实现需求,代码简洁易读,可直接得到目标结果:

library(tidyverse)

# 核心处理代码
result <- df %>%
  # 按行迭代处理
  rowwise() %>%
  # 提取当前行a到f中值为1的列名,存入列表
  mutate(value = list(names(select(., a:f))[c_across(a:f) == 1])) %>%
  # 把value列的列表拆分为独立行,空列表的行保留
  unnest_longer(value, keep_empty = TRUE) %>%
  # 空值(也就是a到f全为0的行)替换为none
  mutate(value = replace_na(value, "none")) %>%
  # 删掉不需要的a到f列
  select(-c(a:f))

如果你习惯用长表转换的写法,也可以用pivot_longer实现,逻辑和你之前尝试的gather方法一致,只是需要增加过滤和合并全0行的步骤:

library(tidyverse)

result <- df %>%
  # 增加行号避免重复行处理出错
  mutate(row_id = row_number()) %>%
  # a到f列转长表
  pivot_longer(cols = a:f, names_to = "value", values_to = "val") %>%
  # 筛选值为1的记录
  filter(val == 1) %>%
  select(-val) %>%
  # 合并全0的行
  full_join(df %>% mutate(value = "none", row_id = row_number()) %>% select(-c(a:f)), 
            by = c("row_id", "age", "gender", "race", "insured")) %>%
  # 过滤重复的none记录
  group_by(row_id) %>%
  filter(n() == 1 | value != "none") %>%
  ungroup() %>%
  select(-row_id)

两种写法运行后得到的结果和你给出的预期输出完全一致,你可以根据自己的使用习惯选择。

内容的提问来源于stack exchange,提问作者Bcohen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:15:00