gpt4 book ai didi

r - 为什么有时在使用重复键加入 data.tables 时需要 allow.cartesian?

转载 作者:行者123 更新时间:2023-12-03 10:59:45 26 4
gpt4 key购买 nike

当 R 中的 data.table 中存在重复键时,我试图理解 J() 查找的逻辑。

这是我尝试过的一个小实验:

library(data.table)
options(stringsAsFactors = FALSE)

x <- data.table(keyVar = c("a", "b", "c", "c"),
value = c( 1, 2, 3, 4))
setkey(x, keyVar)

y1 <- data.frame(name = c("d", "c", "a"))
x[J(y1$name), ]
## OK

y2 <- data.frame(name = c("d", "c", "a", "b"))
x[J(y2$name), ]
## Error: see below

x2 <- data.table(keyVar = c("a", "b", "c"),
value = c( 1, 2, 3))
setkey(x2, keyVar)
x2[J(y2$name), ]
## OK

我收到的错误消息是:
Error in vecseq(f__, len__, if (allow.cartesian) NULL else as.integer(max(nrow(x),  :
Join results in 5 rows; more than 4 = max(nrow(x),nrow(i)). Check for duplicate key
values in i, each of which join to the same group in x over and over again. If that's
ok, try including `j` and dropping `by` (by-without-by) so that j runs for each group
to avoid the large allocation. If you are sure you wish to proceed, rerun with
allow.cartesian=TRUE. Otherwise, please search for this error message in the FAQ, Wiki,
Stack Overflow and datatable-help for advice.

我真的不明白这一点。我知道我应该在查找函数中避免重复键,我只是想获得一些见解,这样我将来就不会犯任何错误。

非常感谢您的帮助。这是一个很棒的工具。

最佳答案

您不必避免重复键。只要结果不大于 max(nrow(x), nrow(i)) ,即使您有重复,您也不会收到此错误。这基本上是一种预防措施。

当您有重复的键时,结果连接有时会变得更大。自 data.table尽早知道此连接将产生的总行数,它提供此错误消息并要求您使用参数 allow.cartesian=TRUE如果你真的确定。

这是一个(夸张的)示例,说明了此错误消息背后的想法:

require(data.table)
DT1 <- data.table(x=rep(letters[1:2], c(1e2, 1e7)),
y=1L, key="x")
DT2 <- data.table(x=rep("b", 3), key="x")

# not run
# DT1[DT2] ## error

dim(DT1[DT2, allow.cartesian=TRUE])
# [1] 30000000 2
DT2 中的重复项导致 DT1 中“a”总数的 3 倍(=1e7)。想象一下,如果您使用 DT2 中的 1e4 值执行连接。 ,结果会爆炸!为了避免这种情况,有 allow.cartesian默认情况下为 FALSE 的参数。

话虽如此,我认为马特曾经提到过,在“大”连接(或导致大量行的连接 - 我猜可能会任意设置)的情况下,可能只提供错误。当/如果实现时,这将使连接正确而不会出现此错误消息,以防连接不会组合爆炸。

关于r - 为什么有时在使用重复键加入 data.tables 时需要 allow.cartesian?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23087358/

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