【发布时间】:2018-07-12 10:01:45
【问题描述】:
我想在数据集中查找所有列中的值(除了一列)匹配的行。在尝试多次尝试让 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
如您所见,这是可行的,但这是我几乎可以肯定很多其他人需要此功能的时候之一,而且我不知道有一个功能可以通过更少的步骤或通常更整洁的方式。有什么建议吗?
至少从twoother 帖子中应用于这种情况的另一种方法是:
answer = iris[duplicated(iris[-4]) | duplicated(iris[-4], fromLast = TRUE),]
但这似乎也只是一种不同的解决方法,而不是单一功能。两种方法都需要相同的时间。 (在我的系统上为 0.08 秒)。没有更整洁/更快的方法吗?
例如就像是 iris%>%duplicates(all=TRUE,ignore=Petal.Width)
【问题讨论】:
-
请用可重复的数据和期望的结果做一个小例子。谢谢。
-
这基本上是
iris[duplicated(iris[-4]) | duplicated(iris[-4], fromLast = TRUE),] -
是的,我之前看过那篇文章,这与大卫的答案非常相似,但对于我认为必须是一项相对常见的任务来说,这似乎也是一个不太优雅的解决方案......有没有返回除一列之外的所有重复项的单个函数?或者甚至只是返回所有重复的条目?
-
关于“是的,我以前看过那个帖子,”你应该在你的帖子中包含这些信息,并清楚地解释为什么以前的答案不能满足你的需求。干杯
-
我添加了一个 dplyr 解决方案,它需要更少的字符来编写,并且可能比基本的 R 解决方案更容易阅读。但是,我并没有对其进行微基准测试来测试速度。