测试数据帧是否是另一个数据帧的排序版本

时间:2013-12-07 16:23:49

标签: r sorting comparison dataframe

测试某些数据帧是否只是另一个数据帧的排序版本是否可行?例如,如果我有两个数据框ab,是否有某种方法可以轻松确定a是否只是b的重新排序版本(反之亦然)?

这是一个简单的例子:

a <- data.frame(x1=1:10, x2=11:20, x3=1:2)
b <- a[order(a$x3, a$x1, decreasing=TRUE),]

我能想到的最接近的是all.equal,但它的输出对我(至少对我来说)没有帮助:

> all.equal(a,b)
[1] "Attributes: < Component 2: Mean relative difference: 0.9545455 >"
[2] "Component 1: Mean relative difference: 0.9545455"                
[3] "Component 2: Mean relative difference: 0.3387097"                
[4] "Component 3: Mean relative difference: 0.6666667"

我想有一些明显的方法可以帮助我。我正在寻找一个可以很好地扩展到许多变量和许多观察结果的通用解决方案(因此上面的例子仅用于演示)。

另外:理想情况下,此类函数还可以识别ab的子集(反之亦然)。

2 个答案:

答案 0 :(得分:5)

我会探索“比较”套餐:

library(compare)
compare(a, b, allowAll=TRUE)
# TRUE
#   sorted

这里显示它必须在数据发现数据相同之前对数据进行排序。

这是一个稍微复杂的例子,其中包括强制转换为字符的行,重新排序的行以及重新排序的列:

a <- data.frame(x1=1:10, x2=11:20, x3=1:2, x4 = letters[1:10])
b <- with(a, a[order(x3, x1, decreasing=TRUE), ])
b$x4 <- as.character(b$x4)
b <- b[c(4, 1, 3, 2)]

以下是compare

的结果
compare(a, b, allowAll=TRUE)
# TRUE
#   reordered columns
#   [x4] coerced from <character> to <factor>
#   sorted

答案 1 :(得分:3)

您可以对所有列中的两个数据框进行排序,并使用identical

identical(a[do.call(order, a), ], b[do.call(order, b), ])
#[1] TRUE