我想创建一个只有两列的新数据表,并使用这两列作为键将其与另一个表连接。我能做到这一点:
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
答案 0 :(得分:7)
您可以使用key
参数创建 data.table 时键入:
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)]
为我返回 empty 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
。