2014-12-02 82 views
2

假設我的數據框(mydata)中有三個變量:1)id,2)大小寫和3)值。刪除每個ID的重複項

mydata <- data.frame(id=c(1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), case=c("a","b","c","c","b","a","b","c","c","a","b","c","c","a","b","c","a"), value=c(1,34,56,23,34,546,34,67,23,65,23,65,23,87,34,321,87)) 


mydata 
    id case value 
1 1 a  1 
2 1 b 34 
3 1 c 56 
4 1 c 23 
5 1 b 34 
6 2 a 546 
7 2 b 34 
8 2 c 67 
9 2 c 23 
10 3 a 65 
11 3 b 23 
12 3 c 65 
13 3 c 23 
14 4 a 87 
15 4 b 34 
16 4 c 321 
17 4 a 87 

對於每個id,我們可以有類似的'case'字符,它們的值可以相同或不同。所以基本上,如果它們的值相同,我只需要保留一個並刪除重複。

我的最終數據,然後將

id case value 
1 1 a  1 
2 1 b 34 
3 1 c 56 
4 1 c 23 
5 2 a 546 
6 2 b 34 
7 2 c 67 
8 2 c 23 
9 3 a 65 
10 3 b 23 
11 3 c 65 
12 3 c 23 
13 4 a 87 
14 4 b 34 
15 4 c 321 

回答

5

你可以嘗試duplicated

mydata[!duplicated(mydata[,c('id', 'case', 'value')]),] 
#  id case value 
#1 1 a  1 
#2 1 b 34 
#3 1 c 56 
#4 1 c 23 
#6 2 a 546 
#7 2 b 34 
#8 2 c 67 
#9 2 c 23 
#10 3 a 65 
#11 3 b 23 
#12 3 c 65 
#13 3 c 23 
#14 4 a 87 
#15 4 b 34 
#16 4 c 321 

或者使用uniqueby選項從data.table

library(data.table) 
set.seed(25) 
mydata1 <- cbind(mydata, value1=rnorm(17)) 
DT <- as.data.table(mydata1) 
unique(DT, by=c('id', 'case', 'value')) 
# id case value  value1 
#1: 1 a  1 -0.21183360 
#2: 1 b 34 -1.04159113 
#3: 1 c 56 -1.15330756 
#4: 1 c 23 0.32153150 
#5: 2 a 546 -0.44553326 
#6: 2 b 34 1.73404543 
#7: 2 c 67 0.51129562 
#8: 2 c 23 0.09964504 
#9: 3 a 65 -0.05789111 
#10: 3 b 23 -1.74278763 
#11: 3 c 65 -1.32495298 
#12: 3 c 23 -0.54793388 
#13: 4 a 87 -1.45638428 
#14: 4 b 34 0.08268682 
#15: 4 c 321 0.92757895 
+0

我會的,但也有數據集中其他變量和它們的值可能是不同的..所以我只需要調整案例和價值。 – user9292 2014-12-02 17:16:07

+0

@ user9292您可以對三個變量的數據集進行子集歸類。即。 'mydata [!重複(mydata [,c('id','case','value')]),]' – akrun 2014-12-02 17:17:18

4

案例和唯一的價值?易:

> mydata[!duplicated(mydata[,c("id","case","value")]),] 

即使你有大量數據集中更多的變數,他們將不會被調用duplicated()考慮。

10

要添加到其他的答案,這裏有一個dplyr方法:

library(dplyr) 
mydata %>% group_by(id, case, value) %>% distinct() 

或者

mydata %>% distinct(id, case, value) 
+0

這似乎是過度複雜的問題 - 你可以在baseR中快樂地做到這一點,而不需要加載更多的庫和必須學習管道語法。 – 2014-12-02 17:54:10

+1

@OliverKeyes,這是值得downvote ???從先前的觀點來看,我相信我的回答並不是那麼糟糕或錯誤 – 2014-12-02 17:56:47

+2

@OliverKeyes與單獨的R相比,有更多的方法來給貓換膚。當我們迂腐時,你的意思是「軟件包」而不是「庫」。 – 2014-12-03 01:05:52