2014-10-30 94 views
2

的獲取行我有A R數據框,看起來是這樣的:那裏有多個相同的值

A B   C 
14 apple  45 
14 bannaa  23 
15 car  234 
16 door  12 
16 ear  325 

正如你所看到的,14和16是重複的。我想:

A B   C 
14 apple  45 
14 bannaa  23 
16 door  12 
16 ear  325 

到目前爲止,我有table(DF$A) > 1,但如何/什麼做我想做什麼,最簡單的方法?

回答

2

這裏的另一種可能的基礎R解決方案

indx <- with(df, ave(A, A, FUN = length)) 
df[indx > 1, ] 
# A  B C 
# 1 14 apple 45 
# 2 14 bannaa 23 
# 4 16 door 12 
# 5 16 ear 325 

或者使用data.table

library(data.table) 
setDT(df)[, .SD[.N > 1], by = A] 
#  A  B C 
# 1: 14 apple 45 
# 2: 14 bannaa 23 
# 3: 16 door 12 
# 4: 16 ear 325 

setDT(df)[, if(.N > 1) .SD, by = A] 

最後,使用rle

## df <- df[order(df$A), ] # If the data isn't sorted by `A`, you''ll need to sort it first 
indx <- rle(df$A)$lengths 
df[rep(indx > 1, indx), ] 
# A  B C 
# 1 14 apple 45 
# 2 14 bannaa 23 
# 4 16 door 12 
# 5 16 ear 325 
+0

嗯,'.SD [.N>。]'似乎很常見,不是嗎?然後優化時間。 – Arun 2014-11-03 23:19:30

+0

@阿倫,我在(也見[這裏](http://stackoverflow.com/questions/26703764/find-duplicated-rows-with-original/26704121?s=1|0.0000#26704121))送我一封電子郵件與指示:) – 2014-11-04 09:14:48

1
indx <- duplicated(df[,"A"])|duplicated(df[,"A"],fromLast=TRUE) 
df[indx,] 
# A  B C 
#1 14 apple 45 
#2 14 bannaa 23 
#4 16 door 12 
#5 16 ear 325 
+0

什麼fromLast做獎金的解決方案?你可以在沒有[,1]的情況下執行,只需調用列名稱? – SuperString 2014-10-30 18:47:15

+0

@SuperString'fromLast'表示從相反方向考慮複製。當你做'重複(df [,「A」])'時,只有重複的元素將是TRUE,即。它不會採取第一個價值。通過逆轉,我們同時獲得了「第一」和其他所有人。 – akrun 2014-10-30 18:53:26

1

既然你已經使用了不同的方法開始,這裏是你如何能完成它:

x <- table(df$A) 
df[df$A %in% names(x[x>1]),] 
# A  B C 
#1 14 apple 45 
#2 14 bannaa 23 
#4 16 door 12 
#5 16 ear 325 

它使用的事實,names(x)給你列A,你可以子集所有的獨特價值這些值通過使用names(x[x>1])發生一次以上。

而另一種選擇,如果你已經很熟悉dplyr,應該是:

require(dplyr) 
df %>% group_by(A) %>% filter(n() > 1)