我有一些包含许多变量的大型数据集。有一个“关键”变量是研究参与者的ID。在这些数据集中,有一些ID是重复的。我已经编写了代码来提取重复ID的所有数据,但我想要一种方法来检查这些ID的其余变量是否相等。以下是一个简单的例子:
ID X Y Z
1 2 3 4
1 2 3 5
2 5 5 4
2 5 5 4
3 1 2 3
3 2 2 3
3 1 2 3
在这个例子中,我希望能够识别ID 1和ID 3的行并非全部相等。在R中有没有办法做到这一点?
答案 0 :(得分:1)
您可以使用duplicated
:
d <- read.table(text='ID X Y Z
1 2 3 4
1 2 3 5
2 5 5 4
2 5 5 4
3 1 2 3
3 2 2 3
3 1 2 3
4 1 1 1', header=TRUE)
tapply(duplicated(d), d[, 1], function(x) all(x[-1]))
## 1 2 3 4
## FALSE TRUE FALSE TRUE
Duplicated返回一个向量,指示对于数据帧的每一行,是否在数据帧的早期遇到过它。我们在此逻辑向量上使用tapply
,将其拆分为基于ID
的组,并将函数应用于每个组。我们应用的函数是all(x[-1])
,即我们询问该组的所有行(初始行除外)是否都是重复的?
请注意,我添加了一个包含单个记录的组,以确保解决方案在这些情况下也能正常工作。
或者,您可以将数据框缩减为unique
的唯一记录,然后按ID
拆分,并检查每个拆分是否只有一行:
sapply(split(unique(d), unique(d)[, 1]), nrow) == 1
## 1 2 3 4
## FALSE TRUE FALSE TRUE
(如果它是一个大数据帧,则需要提前计算unique(d)
而不是两次调用它。)