基于关键变量确定R中行之间的一致性

时间:2015-02-20 02:52:36

标签: r

我有一些包含许多变量的大型数据集。有一个“关键”变量是研究参与者的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中有没有办法做到这一点?

1 个答案:

答案 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)而不是两次调用它。)