2016-12-01 146 views
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 *”) ,函数(x){paste(unique(x),collapse =',')})]'。 – nicola

+0

这是真棒@尼古拉,请考虑写下你的答案,然后我可以接受它。 – MFR

+0

很高兴帮助。我写了一个答案。 – nicola

回答

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

基本逻辑后面以下代码:

一)关于分割每行“”,(ii)去除空白(三)采取独特价值
(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 
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" 
>