2014-03-26 58 views
3
> part1<-data.frame(key=c(5,6,7,8,9),x=c("b","d","a","c","b")) 
> part1 
    key x 
1 5 b # key==5,x==b 
2 6 d 
3 7 a 
4 8 c 
5 9 b 
> part2<-data.frame(key=c(1,2,3,4,5), x=c("c","a","b","d","a")) 
> part2 
    key x 
1 1 c 
2 2 a 
3 3 b 
4 4 d 
5 5 a # key==5,x==a 

有2個以上的數據框,但我只是在這個例子中使用2。然後我使用lapply將它們全部放在名爲dflist1的列表中,然後將它們綁定。對於這個例子,我只是手動做。根據關鍵變量rbind並覆蓋重複的行?

dflist1<-list(part1,part2) 
final<-do.call(rbind,dflist1) 
final<-final[order(final$key),] #sort by key 

結果:

> final 
    key x 
6 1 c 
7 2 a 
8 3 b 
9 4 d 
1 5 b #duplicate from part1 
10 5 a #duplicate from part2 
2 6 d 
3 7 a 
4 8 c 
5 9 b 

我想擺脫重複的。它很容易使用!duplicated(),但在這種情況下,我特別想丟棄/覆蓋早期數據框中的行 - 即在這種情況下,part1中的「5b」應該被part2中的「5a」丟棄/覆蓋。如果part3的值是「5b」,那麼part2的「5a」將被part3的「5b」丟棄/覆蓋。

我想要什麼:

key x 
6 1 c 
7 2 a 
8 3 b 
9 4 d 
10 5 a #this is from part2, no more duplicate from part1 
2 6 d 
3 7 a 
4 8 c 
5 9 b 

目前的解決方案:我能想到的唯一的事情就是添加一個功能標誌一個額外的變量中的每個數據幀,然後進行排序,並使用複製在該變量! ..有沒有更簡單或更優雅的解決方案,不需要標記?

+0

提示:使用'data.table(),setkey的(),唯一的()' –

+0

另外,還要注意的是,R的排序功能是[穩定的排序算法](http://en.wikipedia.org/wiki/Sorting_algorithm#Stability)並保留衛星數據,因此您可以反轉,使用!重複,然後再次反向。 –

+0

也許「重複」的「from last = T」參數可能有用嗎?例如。 '最後[!重複(最後一個$ key,fromLast = T)]'看起來像你的輸出 –

回答

0
## Create many data.frames 

set.seed(1) 

## Normally, do this in lapply... 
part1 <- data.frame(key=1:6, x=sample(letters, 6)) 
part2 <- data.frame(key=4:8, x=sample(letters, 5)) 
part3 <- data.frame(key=8:12, x=sample(letters, 5)) 

library(data.table) 

## Collect all your "parts" 
PARTS.LIST <- lapply(ls(pattern="^part\\d+"), function(x) get(x)) 


DT.part <- rbindlist(PARTS.LIST) 

setkey(DT.part, key) 
unique(DT.part, by="key") 

ORIGINAL   UNIQUE 
---------   ----------- 
> DT.part   > unique(DT.part, by="key") 
    key x    key x 
1: 1 l   1: 1 l 
2: 2 v   2: 2 v 
3: 3 k   3: 3 k 
4: 4 q   4: 4 q 
5: 4 i   5: 5 r 
6: 5 r   6: 6 f 
7: 5 w   7: 7 v 
8: 6 f   8: 8 f 
9: 6 o   9: 9 j 
10: 7 v   10: 10 d 
11: 8 f   11: 11 g 
12: 8 l   12: 12 m 
13: 9 j 
14: 10 d 
15: 11 g 
16: 12 m 
+1

抱歉疏浚這個,但原始海報不接受這個答案或跟進它。我和他們處於相同的情況(除了我使用多個鍵),這個答案只是略微不起作用。我希望能夠保留關鍵條目的後者,而不是第一條。除了保留第一個鍵(5,r)而不是預期的鍵(5,w)之外,這個功能完美無缺。密鑰的排序取決於您綁定不同數據幀的順序嗎? –

+0

嗨@kyles。您可以發佈一個新問題,並直接鏈接到此。 (在這裏寫下我的電話) –