删除字符串中的重复项

时间:2016-12-01 13:54:43

标签: r

我有以下数据集

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 = ', ')
})

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"
>

答案 2 :(得分: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