如何在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
相关产品推荐
相关产品推荐

