gpt4 book ai didi

链接时R data.table keyby多列

转载 作者:行者123 更新时间:2023-12-01 09:53:39 26 4
gpt4 key购买 nike

我想创建一个只有两列的新数据表,并使用这两列作为键将它与另一个表连接起来。我可以这样做:

a.dt <- data.table(x = 1:3, y = 2:4)
setkey(a.dt,x,y)
key(a.dt)
# [1] "x" "y"
# ...(join)

但我不想使用 setkey - 我想立即链接到连接中,即在创建表后我想 keyby 两个新变量。出于我不清楚的原因,我收到此错误:

a.dt <- data.table(x = 1:3, y = 2:4)[, .SD, keyby = .(x,y)]
# Error in jsub[[ii]] : attempt to select less than one element

这是我丑陋的解决方法

a.dt <- data.table(x = 1:3, y = 2:4, z = 3:5)[, .SD, keyby = .(x,y)][,z := NULL]
key(a.dt)
# [1] "x" "y"

有人可以解释为什么我不能 keyby 这两个变量吗?我在做一些根本上很愚蠢的事情吗?

编辑:为了完整性添加 session 信息

sessionInfo()
# R version 3.2.1 (2015-06-18)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows 8 x64 (build 9200)

# locale:
# [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
# [4] LC_NUMERIC=C LC_TIME=English_United States.1252

# attached base packages:
# [1] stats graphics grDevices utils datasets methods base

# other attached packages:
# [1] data.table_1.9.4 plyr_1.8.2 foreign_0.8-63

# loaded via a namespace (and not attached):
# [1] magrittr_1.5 tools_3.2.1 reshape2_1.4.1 Rcpp_0.12.0 stringi_0.4-1 stringr_1.0.0 chron_2.3-45

最佳答案

您可以在创建 data.table 时使用 key 参数进行键入:

require(data.table) #v1.9.6
DT2 = data.table(x=3:4, y=4:5, w=5:6)
DT1 = data.table(x=1:3, y=2:4, z=7:9, key=c("x", "y"))[DT2]

或者,从 v1.9.6 开始,您可以使用 on= 参数来指定应该执行连接的列。

DT2 = data.table(a=3:4, b=4:5, w=5:6)
DT1 = data.table(x=1:3, y=2:4, z=7:9)[DT2, on=c(x="a", y="b")]

另一种方法是在 list 上使用 setDT() 以及 key 参数。

DT2 = data.table(a=3:4, b=4:5, w=5:6)
DT1 = setDT(list(x=1:3, y=2:4, z=7:9), key=c("x", "y"))[DT2]

dt[, .SD, keyby=.(x, y)] 为我返回一个空 data.table(它应该如此)。不确定您使用的是哪个版本的 data.table。这是因为 .SD 默认情况下会分配所有列by= 中提到的列除外。由于有两列,并且您已将这两列都提供给分组依据,因此 .SD 为空。因此返回一个空的 data.table。如果你真的想要这种行为,你需要显式设置 .SDcols 如下:

dt[, .SD, keyby=.(x, y), .SDcols=c("x", "y")]
# or from v1.9.6 we can also do
dt[, .SD, keyby=.(x, y), .SDcols=x:y]

但请注意,这将返回 x,y 两次。

关于链接时R data.table keyby多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32954874/

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