我试图在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
Run Code Online (Sandbox Code Playgroud)
我得到的错误消息是:
Error in vecseq(f__, len__, if (allow.cartesian) NULL else as.integer(max(nrow(x), :
Join results …Run Code Online (Sandbox Code Playgroud) 我有两个data.tables:DT和meta.当我使用它们合并它们时DT[meta],内存使用量增加了10 GB以上(并且合并非常慢).出了什么问题?似乎合并是成功的,但我只能看单行,否则我的内存耗尽.DT本身是通过合并两个data.tables创建的,没有任何问题.
编辑:
关键似乎是一个问题.我可以毫无问题地做到以下几点:
DT[,id:=1:nrow(DT)]
meta[,id:=1:nrow(DT)]
setkey(DT,id)
setkey(meta,id)
DT2<-DT[meta] # Comment from Matthew Dowle:
# X[Y] (or merge) on a key of 1:nrow(DT) is just a cbind, isn't it?
unique(DT2[,"Moor_ID",with=F]==DT2[,"Moor_ID.1",with=F])
Moor_ID
[1,] TRUE
Run Code Online (Sandbox Code Playgroud)
第一个数据.表:
str(DT)
Classes ‘data.table’ and 'data.frame': 10212 obs. of 55 variables:
$ DWD_ID : chr "Bremerhav" "Bremerhav" "Bremerhav" "Bremerhav" ...
$ numdays : int 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 ...
$ days : Date, …Run Code Online (Sandbox Code Playgroud)