过滤仅显示重复项的数据框

时间:2017-04-20 04:22:31

标签: r filter duplicates

我需要一些帮助来过滤数据框。

df有几列,我想把它分成两个数据帧:

1-仅包含第一列重复的行(包括所有副本)。

2-其余行,不重复。

这是一个例子: 这将是原始的。

          V1  V2 
    [1,] "A" "1"
    [2,] "B" "1"
    [3,] "A" "1"
    [4,] "C" "2"
    [5,] "D" "3"
    [6,] "D" "4"

我想变成这个:

         V1  V2 
   [1,] "A" "1"
   [2,] "A" "1"
   [3,] "D" "3"
   [4,] "D" "4"

而且:

        V1  V2 
  [1,] "B" "1"
  [2,] "C" "2"

有办法吗?我已尝试导出到Excel,但数据集太大而无法使其可行。

谢谢

4 个答案:

答案 0 :(得分:1)

考虑df作为输入,您可以使用dplyr并尝试:

df %>% group_by(V1) %>% filter(n() > 1)

表示重复项

df %>% group_by(V1) %>% filter(n() == 1)

表示唯一条目。

答案 1 :(得分:1)

您可以使用duplicated但请注意duplicated仅在第一个重复值返回TRUE,即

> duplicated(c("A", "A", "A"))
[1] FALSE  TRUE  TRUE 

不会为第一个TRUE返回"A"。如果您想捕获"A"的所有值,您可以例如使用

duplicated(c("A", "A", "A")) | duplicated(c("A", "A", "A"), fromLast = TRUE)
# [1] TRUE TRUE TRUE

然后,您可以使用

分隔数据
## Index of the duplicated values:
indDuplicatedVec <- duplicated(d[,1]) | duplicated(d[,1], fromLast = TRUE)

myDuplicates <- d[indDuplicatedVec, ]
myUniques <- d[!indDuplicatedVec, ]

> myDuplicates
#V1 V2
#1  A  1
#3  A  1
#5  D  3
#6  D  4

> myUniques
#V1 V2
#2  B  1
#4  C  2

答案 2 :(得分:0)

我们可以使用data.table

library(data.table)
setDT(df)[, .SD[.N >1], V1]

答案 3 :(得分:-1)

尝试

d[!duplicated(d),]

d[duplicated(d),]

其中d是您的数据库。

===更新=== 如果只需要第一列,并且所有重复项都需要单独列,则可以执行以下操作:

library(gdata) d[duplicated2(d$V1,bothWays = T),] d[!duplicated2(d$V1,bothWays = T),]

如果只需要基础R,那么:

bm <- duplicated(d$V1) | duplicated(d$V1,fromLast = TRUE) d[bm,] d[!bm,]