如何使用R移除列中每行字符串的重复字符?
嘿,这个需求处理起来其实很简单,我给你两种常用的解决方案,你可以根据自己的习惯来选:
方法一:用Base R原生实现(无需额外安装包)
先把你的示例数据构造出来:
df <- data.frame(name = c(A="a,a,b,c,d,d,d", B="a,b,b,b,f", C="d,d,d,d", D="a,a"), row.names = c("A", "B", "C", "D"))
接下来一行代码就能完成去重操作:
df$name <- sapply(strsplit(df$name, ","), function(x) paste(unique(x), collapse = ","))
简单解释下步骤:
strsplit(df$name, ","):把每个字符串按逗号拆分成独立的字符向量unique(x):对拆分后的向量去除重复元素paste(..., collapse = ","):把去重后的元素再用逗号连接成字符串sapply():把上面的操作批量应用到name列的每一行
方法二:用tidyverse工具链(更符合现代R风格)
如果你平时习惯用tidyverse系列包(比如dplyr、stringr),可以用这个更直观的写法:
先加载必要的包:
library(tidyverse)
然后用管道流处理数据:
df <- df %>% mutate(name = str_split(name, ",") %>% map(unique) %>% map_chr(paste, collapse = ","))
这个逻辑和Base R的方法本质一样,只是用了tidyverse的语法:
str_split():和strsplit功能一致,拆分字符串map(unique):对每个拆分后的向量执行去重map_chr():把处理后的列表转回字符向量,方便赋值回数据框
不管用哪种方法,最终你都会得到想要的结果:
print(df) # name # A a,b,c,d # B a,b,f # C d # D a
内容的提问来源于stack exchange,提问作者Morteza Razavi
相关产品推荐
相关产品推荐

