2013-09-28 22 views
1

我想我只是沒有看到它,但所有類似的東西,我發現在網上,在Mailinglist存檔或常見問題解答不能真正闡明我的問題。apply-strsplit-rowwise包括排序和嵌套粘貼

我發現的最接近的是這樣的: apply strsplit rowwise

我有一個DF,有兩個字符列和一個數值列。 填充像這樣:

df=data.frame(name1=c("A","B","C","D"), 
      name2=c("B","A","D","C"), 
      nums=c(1,1,4,4), 
      stringsAsFactors=F) 

現在我想找到這個獨特的行,然而,只有基於兩個名稱列。而對於那些欄目,欄目的順序沒有意義,因此如果我理解正確,我不能使用duplicated

因此,我想到了將兩個名稱列按行組合,進行逐行排序,並打印出矢量(長度= 2與sapply之類的組合)的paste

但是我沒有得到它的工作。

到目前爲止,我使用了for循環,但是這會在原始數據上花費時間。

for(i in 1:length(df$name1)){ 
      mysort=sort(c(df$name1[i],df$name2[i])) 
      df$combname[i]=paste(mysort[1],mysort[2]) 
    } 

歡迎任何建議。也許我錯誤地理解了uniquesapply

回答

1

沒有for循環的解決方案。

df$combname <- apply(df[1:2], 1, function(x) paste(sort(x), collapse="")) 
1

也許你應該探索「data.table」包。這裏有一種方法:

library(data.table) 
DT <- data.table(df) 
DT[, new := paste(sort(c(name1, name2)), collapse = ""), by = 1:nrow(DT)] 
DT 
# name1 name2 nums new 
# 1:  A  B 1 AB 
# 2:  B  A 1 AB 
# 3:  C  D 4 CD 
# 4:  D  C 4 CD 
DT[!duplicated(new), ] 
# name1 name2 nums new 
# 1:  A  B 1 AB 
# 2:  C  D 4 CD