如何用R基于Checked/Unchecked重塑数据集并自动处理列名?
用R实现数据集格式转换:从宽格式到长格式并提取处理类型
当然可以用R完全自动化实现这个转换!不用手动移除列名里的Treatment=前缀,不管是用tidyverse工具链还是reshape包都能轻松搞定,我给你一步步演示:
第一步:构造示例数据集
先把你给出的文本结构转换成R能识别的数据框:
library(tidyverse) # 模拟你的原始数据集 df <- tibble( ID = c("Patient1", "Patient2", "Patient3"), `Treatment=Induction Chemo` = c("Checked", "Unchecked", "Unchecked"), `Treatment=Hypomethylating Chemo` = c("Unchecked", "Checked", "Unchecked"), `Treatment=Consolidation Chemo` = c("Unchecked", "Unchecked", "Checked") )
第二步:用tidyverse实现转换(推荐,语法更直观)
用tidyr::pivot_longer把宽格式转成长格式,再过滤出Checked的记录,最后自动去掉Treatment=前缀:
result <- df %>% # 将所有Treatment开头的列转成两列:Treatment(原列名)、Status(Checked/Unchecked) pivot_longer( cols = starts_with("Treatment="), names_to = "Treatment", values_to = "Status" ) %>% # 只保留每个患者被选中的处理记录 filter(Status == "Checked") %>% # 用正则表达式自动移除开头的Treatment=前缀 mutate(Treatment = str_remove(Treatment, "^Treatment=")) %>% # 保留需要的两列 select(ID, Treatment) # 查看结果 print(result)
运行后你会得到完全符合要求的输出:
# A tibble: 3 × 2 ID Treatment <chr> <chr> 1 Patient1 Induction Chemo 2 Patient2 Hypomethylating Chemo 3 Patient3 Consolidation Chemo
如果你想用reshape包实现
虽然reshape包的语法稍显老旧,但也能完成这个需求:
library(reshape2) # 转成长格式 melted_df <- melt(df, id.vars = "ID", variable.name = "Treatment", value.name = "Status") # 过滤并处理列名 result_reshape <- melted_df %>% filter(Status == "Checked") %>% mutate(Treatment = gsub("^Treatment=", "", Treatment)) %>% select(ID, Treatment)
两种方法都不需要手动修改列名,全程自动化完成转换,你可以根据自己的习惯选择工具~
内容的提问来源于stack exchange,提问作者Adam Alayli
相关产品推荐
相关产品推荐

