2016-12-01 179 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" 
>