选择除一列之外的所有重复行

Pau*_*ery 5 r tidyverse

我想在数据集中查找所有列(除了一列)中的值都匹配的行。在尝试多次尝试让duplicated() 返回重复行的所有实例(不仅仅是第一个实例)失败后,我想出了一种方法来做到这一点(如下)。

例如,我想识别 Iris 数据集中除 Petal.Width 之外的所有相等的行。

require(tidyverse)
x = iris%>%select(-Petal.Width)
dups = x[x%>%duplicated(),]
answer =  iris%>%semi_join(dups)

> answer 
   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1           5.1         3.5          1.4         0.2    setosa
2           4.9         3.1          1.5         0.1    setosa
3           4.8         3.0          1.4         0.1    setosa
4           5.1         3.5          1.4         0.3    setosa
5           4.9         3.1          1.5         0.2    setosa
6           4.8         3.0          1.4         0.3    setosa
7           5.8         2.7          5.1         1.9 virginica
8           6.7         3.3          5.7         2.1 virginica
9           6.4         2.8          5.6         2.1 virginica
10          6.4         2.8          5.6         2.2 virginica
11          5.8         2.7          5.1         1.9 virginica
12          6.7         3.3          5.7         2.5 virginica
Run Code Online (Sandbox Code Playgroud)

如您所见,这是可行的,但这是我几乎可以肯定很多其他人需要此功能的时候之一,并且我不知道以更少的步骤或通常更整洁的方式完成此操作的单个功能. 有什么建议?

至少来自其他两个 职位的另一种方法适用于这种情况:

answer = iris[duplicated(iris[-4]) | duplicated(iris[-4], fromLast = TRUE),]
Run Code Online (Sandbox Code Playgroud)

但这似乎也只是一种不同的解决方法,而不是单一功能。两种方法都需要相同的时间。(在我的系统上为 0.08 秒)。有没有更整洁/更快的方法来做到这一点?

例如像 iris%>%duplicates(all=TRUE,ignore=Petal.Width)

Len*_*nyy 5

iris[duplicated(iris[,-4]) | duplicated(iris[,-4], fromLast = TRUE),]
Run Code Online (Sandbox Code Playgroud)

重复行(不管第 4 列)duplicated(iris[,-4])给出重复集的第二行,第 18、35、46、133、143 和 145 行,并duplicated(iris[,-4], fromLast = TRUE)给出每个重复集的第一行,1、10、13、102、125 和129. 通过|在 12TRUE秒内添加这个结果,所以它返回了预期的输出。

或者也许使用 dplyr:基本上你对所有变量进行分组,除了Petal.Width,计算它们出现的次数,并过滤那些出现多次的变量。

library(dplyr)
iris %>% 
  group_by_at(vars(-Petal.Width)) %>% 
  filter(n() > 1)

   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
          <dbl>       <dbl>        <dbl>       <dbl>    <fctr>
 1          5.1         3.5          1.4         0.2    setosa
 2          4.9         3.1          1.5         0.1    setosa
 3          4.8         3.0          1.4         0.1    setosa
 4          5.1         3.5          1.4         0.3    setosa
 5          4.9         3.1          1.5         0.2    setosa
 6          4.8         3.0          1.4         0.3    setosa
 7          5.8         2.7          5.1         1.9 virginica
 8          6.7         3.3          5.7         2.1 virginica
 9          6.4         2.8          5.6         2.1 virginica
10          6.4         2.8          5.6         2.2 virginica
11          5.8         2.7          5.1         1.9 virginica
12          6.7         3.3          5.7         2.5 virginica
Run Code Online (Sandbox Code Playgroud)