2012-12-20 206 views
82

我已經讀取了一個CSV文件到一個R data.frame。某些行在其中一列中具有相同的元素。我想刪除該列中重複的行。例如:刪除重複的行

platform_external_dbus   202   16      google  1 
platform_external_dbus   202   16   space-ghost.verbum  1 
platform_external_dbus   202   16     localhost  1 
platform_external_dbus   202   16   users.sourceforge  8 
platform_external_dbus   202   16     hughsie  1 

我只想要其中的一行,因爲其他列在第一列中有相同的數據。

+2

你要哪一個?只是第一個?換句話說:你想保留'google'或'localhost'還是'hughsie'? –

+0

這一部分我的統計分析無關緊要。我只是試圖將項目標題(第一列),錯誤數量(第二列)和項目組織數量(第三列)聯繫起來。 – user1897691

+3

很酷。拋出不必要的列並使用?獨特的 –

回答

114

只是孤立的數據幀需要,然後使用獨特的功能欄:d

# in the above example, you only need the first three columns 
deduped.data <- unique(yourdata[ , 1:3 ]) 
# the fourth column no longer 'distinguishes' them, 
# so they're duplicates and thrown out. 
+0

這看起來好像完美。你能向我解釋一下這個代碼中的[[1:3]部分是怎麼回事?我是R新手,這就是爲什麼我問我只能假設一個明顯的問題。 – user1897691

+6

@ user1897691標記爲正確;然後; [看這個](http://www.screenr.com/fCs8),如果你喜歡,請檢查[twotorials.com](http://twotorials.com) –

110

誰的人來到這裏尋找重複的行去除一般的答案,可以使用!duplicated()

a <- c(rep("A", 3), rep("B", 3), rep("C",2)) 
b <- c(1,1,2,4,1,1,2,2) 
df <-data.frame(a,b) 

duplicated(df) 
[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE TRUE 

> df[duplicated(df), ] 
    a b 
2 A 1 
6 B 1 
8 C 2 

> df[!duplicated(df), ] 
    a b 
1 A 1 
3 A 2 
4 B 4 
5 B 1 
7 C 2 

回答:Removing duplicated rows from R data frame

+0

我想要創建一個新的varibale,用於標記某個變量*上是否有重複的*幾乎就像 df $ duplicates < - ifelse(此列中的值a ==列a,1,0中的上一行值) – jacob

+0

@ jacob看到這個問題http://stackoverflow.com/questions/12495345/find-indices-of-duplicated-rows –

+1

這保持了第一次出現的價值,並刪除了其餘的重複,對不對?或者它隨機刪除值? – alphabetagamma

37

功能distinct()dplyr帕茨卡ge執行任意重複刪除操作,允許指定重複變量(如本問題中所述)或考慮所有變量。

數據:

dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2)) 

刪除其中指定的列被複制行:

library(dplyr) 
dat %>% distinct(a, .keep_all = TRUE) 

    a b 
1 1 A 
2 2 B 

刪除其它行的完整重複行:

dat %>% distinct 

    a b 
1 1 A 
2 2 B 
3 1 C 
4 2 D 
5

隨着sqldf

# Example by Mehdi Nellen 
a <- c(rep("A", 3), rep("B", 3), rep("C",2)) 
b <- c(1,1,2,4,1,1,2,2) 
df <-data.frame(a,b) 

解決方案:

library(sqldf) 
    sqldf('SELECT DISTINCT * FROM df') 

輸出:

a b 
1 A 1 
2 A 2 
3 B 4 
4 B 1 
5 C 2 
21

data.table包也有它自己的uniqueduplicated方法有一些額外的功能。

無論是unique.data.tableduplicated.data.table方法有一個額外的by參數,它允許您通過分別

library(data.table) 
DT <- data.table(id = c(1,1,1,2,2,2), 
       val = c(10,20,30,10,20,30)) 

unique(DT, by = "id") 
# id val 
# 1: 1 10 
# 2: 2 10 

duplicated(DT, by = "id") 
# [1] FALSE TRUE TRUE FALSE TRUE TRUE 

列名或它們的位置的characterinteger載體的這些方法的另一個重要特點是一個巨大的性能獲得更大的數據集

library(microbenchmark) 
library(data.table) 
set.seed(123) 
DF <- as.data.frame(matrix(sample(1e8, 1e5, replace = TRUE), ncol = 10)) 
DT <- copy(DF) 
setDT(DT) 

microbenchmark(unique(DF), unique(DT)) 
# Unit: microseconds 
#  expr  min   lq  mean median  uq  max neval cld 
# unique(DF) 44708.230 48981.8445 53062.536 51573.276 52844.591 107032.18 100 b 
# unique(DT) 746.855 776.6145 2201.657 864.932 919.489 55986.88 100 a 


microbenchmark(duplicated(DF), duplicated(DT)) 
# Unit: microseconds 
#   expr  min   lq  mean  median  uq  max neval cld 
# duplicated(DF) 43786.662 44418.8005 46684.0602 44925.0230 46802.398 109550.170 100 b 
# duplicated(DT) 551.982 558.2215 851.0246 639.9795 663.658 5805.243 100 a 
2

或者,您可以將數據以第4列和第5列嵌套到單行中,使用tidyr

library(tidyr) 
df %>% nest(V4:V5) 

# A tibble: 1 × 4 
#      V1 V2 V3    data 
#     <fctr> <int> <int>   <list> 
#1 platform_external_dbus 202 16 <tibble [5 × 2]> 

山坳現在2次3的重複被刪除進行統計分析,可你卻把山坳4個5中的數據tibble並且可以在任何時候返回到原始數據幀與unnest()

0

最普遍的回答可以 例如:

df <- data.frame(rbind(c(2,9,6),c(4,6,7),c(4,6,7),c(4,6,7),c(2,9,6)))) 



new_df <- df[-which(duplicated(df)), ] 

輸出:

 X1 X2 X3 
    1 2 9 6 
    2 4 6 7