我想创建一个仅包含两列的新数据表,并使用这两列作为键将其与另一个表连接。我可以这样做:
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
两个变量吗?我从根本上做傻事吗?编辑:为了完整性,添加会话信息
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
最佳答案
您可以在创建数据表时使用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")]
另一种方法是在列表上使用
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
。