gpt4 book ai didi

R: all.equal() 用于多个对象?

转载 作者:行者123 更新时间:2023-12-03 16:44:25 25 4
gpt4 key购买 nike

使用 all.equal() 比较两个以上对象的最佳方法是什么? ?

这是一种方法:

foo <- c(1:10)
bar <- letters[1:10]
baz <- c(1:10)

# doesn't work because all.equal() returns a character vector when objects not all equal
all(sapply(list(bar, baz), all.equal, foo))

# this works
mode(sapply(list(bar, baz), all.equal, foo)) == "logical" #FALSE

bar <- c(1:10)

mode(sapply(list(bar, baz), all.equal, foo)) == "logical" #TRUE

更新: @BrodieG 指出上面的单行只告诉你对象是否都相等,而 all.equal()如果它们不相等,则告诉您它们的不相等之处。

最佳答案

这是一个选项:

objs <- mget(c("foo", "bar", "faz"))
outer(objs, objs, Vectorize(all.equal))

它比你的好,因为它会检测何时 barfaz是相同的,即使 foo不是。也就是说,它会进行很多不必要的比较,而且速度会很慢。例如,如果我们更改 foo成为 letters[1:10]我们得到:
    foo         bar         faz        
foo TRUE Character,2 Character,2
bar Character,2 TRUE TRUE
faz Character,2 TRUE TRUE

有关出了什么问题的详细信息,只是子集:
outer(objs, objs, Vectorize(all.equal))[1, 2]

产生:
[[1]]
[1] "Modes: character, numeric"
[2] "target is character, current is numeric"

如果您只关心所有对象必须是 all.equal ,那么您的解决方案非常好。

此外,根据评论限制一些重复计算:
res <- outer(objs, objs, function(x, y) vector("list", length(x)))
combs <- combn(seq(objs), 2)
res[t(combs)] <- Vectorize(all.equal)(objs[combs[1,]], objs[combs[2,]])
res

生产
    foo  bar         faz        
foo NULL Character,2 Character,2
bar NULL NULL TRUE
faz NULL NULL NULL

这仍然显示了完整的矩阵,但是很明显比较产生了什么。

关于R: all.equal() 用于多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com