gpt4 book ai didi

r - 将 .BY 与查找表一起使用——意外的结果

转载 作者:行者123 更新时间:2023-12-04 11:03:24 24 4
gpt4 key购买 nike

我想在 dt 中创建一个变量根据查找表k .我得到了一些意想不到的结果,这取决于我如何在 k 中提取感兴趣的变量.

dt <- data.table(x=c(1:10))
setkey(dt, x)

k <- data.table(x=c(1:5,10), b=c(letters[1:5], "d"))
setkey(k, x)

dt[,b:=k[.BY, list(b)],by=x]

dt #unexpected results
# x b
# 1: 1 1
# 2: 2 2
# 3: 3 3
# 4: 4 4
# 5: 5 5
# 6: 6 6
# 7: 7 7
# 8: 8 8
# 9: 9 9
# 10: 10 10

dt <- data.table(x=c(1:10))
setkey(x, x)

dt[,b:=k[.BY]$b,by=x]

dt #expected results
# x b
# 1: 1 a
# 2: 2 b
# 3: 3 c
# 4: 4 d
# 5: 5 e
# 6: 6 NA
# 7: 7 NA
# 8: 8 NA
# 9: 9 NA
# 10: 10 d

谁能解释为什么会这样?

最佳答案

您不必使用 by=.在这里。

第一个解决方案:

设置适当的键并使用来自 data.table 的 X[Y] 语法:

require(data.table)
dt <- data.table(x=c(1:10))
setkey(dt, "x")
k <- data.table(x=c(1:5,10), b=c(letters[1:5], "d"))
setkey(k, "x")

k[dt]

# x b
# 1: 1 a
# 2: 2 b
# 3: 3 c
# 4: 4 d
# 5: 5 e
# 6: 6 NA
# 7: 7 NA
# 8: 8 NA
# 9: 9 NA
# 10: 10 d

OP说这会创建一个新的data.table,这对他来说是不可取的。

第二种解决方案

同样,没有 by :
dt <- data.table(x=c(1:10))
setkey(dt, "x")
k <- data.table(x=c(1:5,10), b=c(letters[1:5], "d"))
setkey(k, "x")

# solution
dt[k, b := i.b]

这不会创建新的 data.table并给出您期待的解决方案。

解释为什么会出现意外结果:

对于第一种情况 你愿意, dt[,b:=k[.BY, list(b)],by=x] .在这里, k[.BY, list(b)]本身返回 data.table .例如:
k[list(x=1), list(b)]

# x b
# 1: 1 a

所以,基本上,如果你会这样做:
k[list(x=dt$x), list(b)]

这也将为您提供所需的解决方案。回答为什么你会得到你所得到的 b := k[.BY, list(b)] ,因为,RHS 返回 data.table并且您正在为其分配一个变量,它采用第一个元素并删除其余元素。例如,执行以下操作:
dt[, c := dt[1], by=x] 
# you'll get the whole column to be 1

对于第二种情况 ,要了解它的工作原理,您必须了解访问 data.table 之间的细微差别。如 k[6]k[list(6)] , 例如:

在第一种情况下, k[6] ,您正在访问 k 的第 6 个元素, 即 10 d .但在第二种情况下,您要求的是 J, join .因此,它搜索 x = 6(关键列)并且因为在 k 中没有任何内容。 ,它返回 6 NA .在您的情况下,因为您使用 k[.BY]它返回一个列表,它是一个 J操作,获取正确的值。

我希望这有帮助。

关于r - 将 .BY 与查找表一起使用——意外的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121631/

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