如何在R语言中保留remission列与lifetime列匹配的取值?
解决方案:筛选remission列中存在于lifetime的物质
针对你的需求,这里提供两种R语言的实现方式,核心逻辑是把逗号分隔的字符串拆成单个物质的集合,取两者的交集后再合并成字符串,空交集则返回空值。
方法一:用tidyverse工具链(推荐,代码更简洁)
先加载tidyverse包,它整合了dplyr(数据处理)、stringr(字符串操作)和purrr(迭代处理):
library(tidyverse) # 处理数据 df_processed <- df %>% mutate( # 把两列的字符串拆成物质列表 lifetime_list = str_split(lifetime, ","), remission_list = str_split(remission, ","), # 逐行筛选匹配的物质 remission_filtered = map2_chr(remission_list, lifetime_list, ~{ matched_items <- intersect(.x, .y) # 没匹配到就返回空字符串,否则合并成逗号分隔的格式 if(length(matched_items) == 0) "" else str_c(matched_items, collapse = ",") }) ) %>% # 移除中间辅助列并 rename 回原列名 select(lifetime, remission_filtered) %>% rename(remission = remission_filtered) # 查看处理后的数据 print(df_processed)
代码说明
str_split():把每一行的逗号分隔字符串拆成单个物质的向量,比如第一行lifetime会变成c("tobacco", "alcohol", "cannabis", "cocaine", "stim")。map2_chr():同时遍历每一行的remission和lifetime列表,用intersect()取两者的交集(即同时存在的物质)。- 最后判断交集是否为空,空则返回
"",否则用逗号合并成原格式的字符串。
方法二:Base R实现(无需额外安装包)
如果不想加载第三方包,可以用Base R的循环来处理:
# 创建处理后的副本 df_processed_base <- df # 逐行遍历处理 for(i in seq(nrow(df_processed_base))){ # 拆分字符串为向量 lifetime_items <- strsplit(df_processed_base$lifetime[i], ",")[[1]] remission_items <- strsplit(df_processed_base$remission[i], ",")[[1]] # 筛选匹配的物质 matched <- intersect(remission_items, lifetime_items) # 更新remission列 df_processed_base$remission[i] <- if(length(matched) == 0) "" else paste(matched, collapse = ",") } # 查看结果 print(df_processed_base)
处理后的预期结果
处理后remission列的内容如下:
""(rx不在第一行的lifetime里)"cannabis,inhal"(仅这两个物质存在于第二行的lifetime)"tobacco"(仅tobacco存在于第三行的lifetime)"cocaine"(仅cocaine存在于第四行的lifetime)"alcohol,cocaine,stim,rx,halluc,dissoc,tranq,inhal"(这些物质都在第五行的lifetime里)"cannabis"(仅cannabis存在于第六行的lifetime)
内容的提问来源于stack exchange,提问作者Fatima
相关产品推荐
相关产品推荐

