从字符串中删除重复项

3
我有以下数据集。
df <- data.frame(
    path = c("a,b,a", 
        "(direct) / (none),   (direct) / (none), google / cpc,    google / cpc", 
        "f,d", 
        "a,c"
    ) 
)

我希望能够删除重复内容,使我的输出变为:
                                                                       path
1:                                                                     a, b
2:                                       (direct) / (none),     google / cpc
3:                                                                     f, d
4:                                                                     a, c

我尝试了这个方法,但是对于第二行没有起作用。
setDT(df)

df$path <- sapply(strsplit(as.character(df$path ), split=","), function(x) {
    paste(unique(x), collapse = ', ')
})

1
你走在正确的道路上。尝试使用 split=",\\s*" 去除不必要的空格。此外,如果你打算使用 data.table,请使用适当的语法避免复制:df[,path:=sapply(strsplit(as.character(df$path ), split=",\\s*"), function(x) {paste(unique(x), collapse = ', ')})] - nicola
太棒了@nicola,请考虑在下面编写您的答案,然后我可以接受它。 - MFR
很高兴能帮到你。我写了一个答案。 - nicola
3个回答

4
您已经接近成功了。唯一需要改进的是您需要使用",\\s*"进行分割,而不仅仅是","。在后一种情况下,调用unique将无法产生所需的输出,因为某些字符串可能因空格数不同而不同。如果您在拆分时删除它们,就可以解决这个问题。
另外,由于您使用了setDT(df),我猜您正在使用data.table。如果是这样,您需要使用适当的data.table语法以避免复制:
df[,path:=sapply(
   strsplit(as.character(df$path ), split=",\\s*"), 
    function(x) {paste(unique(x), collapse = ', ')})]

将通过引用修改path列。


2

看起来你的问题在于第二个字符串中的初始空格。你想保留它吗?如果你愿意放弃它,那么

df$path <- sapply(strsplit(as.character(df$path), split=","), function(x) {
    paste(unique(trimws(x)), collapse = ', ') } )

这是您想要的:

> df$path <- sapply(strsplit(as.character(df$path), split=","), function(x) {
+     paste(unique(trimws(x)), collapse = ', ') } )
> df$path
[1] "a, b"                            "(direct) / (none), google / cpc"
[3] "f, d"                            "a, c"
>

1

以下代码的基本逻辑:

i)将每行按“,”分割,(ii)删除空格,(iii)取唯一值
(iv) 折叠后再粘贴回“,”

t = apply(df, 1, function(x) paste0(unique(trimws(unlist(strsplit(x,",")))), collapse = ","))
df=data.frame(t)
# df
#                               t
#1                            a,b
#2 (direct) / (none),google / cpc
#3                            f,d
#4                            a,c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接