相关疑难解决方法(0)

为什么在使用重复键加入data.tables时需要allow.cartesian?

我试图在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)

r data.table

24
推荐指数
1
解决办法
1万
查看次数

合并data.tables使用超过10 GB的RAM

我有两个data.tables:DTmeta.当我使用它们合并它们时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)

r data.table

5
推荐指数
1
解决办法
1325
查看次数

标签 统计

data.table ×2

r ×2