我的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
,但是如何/最简单的方法来做我想做的事情?
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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)