如何在R语言中对数据框字符串列去除连续重复元素并生成新列
如何在R语言中对数据框字符串列去除连续重复元素并生成新列
嘿,我完全get到你的需求啦——就是要把每个逗号分隔的国家字符串里,连续重复出现的同个国家去掉,只保留交替出现的内容对吧?比如原来一串重复的"Soome"只留一个,接着保留下一个不同的"Eesti",以此类推。下面给你两种实用的解决方法,你可以根据自己的习惯选:
首先先把你的示例数据再放一遍,方便我们测试:
col1 <- 1:2 col2 <- c("Eesti, Soome, Soome, Soome, Eesti, Soome, Eesti, Eesti, Eesti, Soome", "Ukraina, Eesti, Luksembourg, Luksembourg, Eesti, Eesti, Eesti") dt <- data.frame(PERSON_ID = col1, COUNTRIES = col2)
方法一:Base R 原生实现
我们可以写一个自定义函数,专门处理单个字符串的连续重复项,再用sapply批量应用到整个列上:
# 定义去除连续重复项的函数 remove_consec_duplicates <- function(x) { # 把字符串按逗号拆分,同时去掉每个元素的前后空格 country_list <- trimws(strsplit(x, ",")[[1]]) # 筛选出和前一个元素不同的项(第一个元素默认保留) filtered_countries <- country_list[c(TRUE, country_list[-1] != country_list[-length(country_list)])] # 把筛选后的列表重新合并成逗号分隔的字符串 paste(filtered_countries, collapse = ", ") } # 给数据框添加新列COUNTRIES2 dt$COUNTRIES2 <- sapply(dt$COUNTRIES, remove_consec_duplicates)
运行后查看结果,就是你想要的效果啦:
> dt PERSON_ID COUNTRIES COUNTRIES2 1 1 Eesti, Soome, Soome, Soome, Eesti, Soome, Eesti, Eesti, Eesti, Soome Eesti, Soome, Eesti, Soome, Eesti, Soome 2 2 Ukraina, Eesti, Luksembourg, Luksembourg, Eesti, Eesti, Eesti Ukraina, Eesti, Luksembourg, Eesti
方法二:用tidyverse工具链实现
如果你平时习惯用dplyr和stringr这类工具,也可以用管道流的方式实现,代码更简洁直观:
library(dplyr) library(stringr) library(purrr) # 用到map_chr函数 dt <- dt %>% mutate(COUNTRIES2 = map_chr(str_split(COUNTRIES, ", "), ~{ .x %>% trimws() %>% # 去除空格 {.[c(TRUE, .[-1] != .[-length(.)])]} %>% # 筛选非连续重复项 paste(collapse = ", ") # 合并回字符串 }))
逻辑说明
两种方法的核心逻辑是一致的:
- 把逗号分隔的字符串拆分成单个国家的列表
- 去掉每个国家名称前后的空格(避免因为空格导致的判断错误)
- 筛选出和前一个元素不相同的项(第一个元素无条件保留)
- 把筛选后的列表重新合并成逗号分隔的字符串
这样处理后,就完美得到了你需要的COUNTRIES2列,连续重复的国家都被自动剔除啦~
备注:内容来源于stack exchange,提问作者Vida Beach
相关产品推荐
相关产品推荐

