我只是尝试在具有 64G ram 的机器上合并 R 3.0.1 中的两个表,但出现以下错误。帮助将不胜感激。(data.table 版本是 1.8.8)
这是我的代码的样子:
library(parallel)
library(data.table)
Run Code Online (Sandbox Code Playgroud)
data1:几百万行和 3 列。列是tag,prod和v。有 750K 个唯一值tag,从 1 到 1000prod秒不等tag, 的 5000 个可能值prod。v取任何正实值。
setkey(data1, tag)
merge (data1, data1, allow.cartesian=TRUE)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
vecseq(f_ , len _, if (allow.cartesian) NULL else as.integer(max(nrow(x), : Join 结果超过 2^31 行(内部 vecseq 达到物理限制)中的错误)。很可能是错误指定的加入. 检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一个组。如果可以,请尝试包含
j和删除by(by-without-by),以便 j 为每个组运行以避免大分配。否则,请在FAQ、Wiki、Stack Overflow 和datatable-help 中搜索此错误消息以获取建议。调用:merge -> merge.data.table -> [ …
我想更新表中的值,包含组中的上一行的值(并且可能在给定条件下停止更新)
这是一个例子:
set.seed(12345)
field <- data.table(time=1:3, player = letters[1:2], prospects = round(rnorm(6),2))
setkey(field, player, time)
field[time == 1, energy := round(rnorm(2),2)] #initial level - this is what I want to propagate down the table
#let 'prospects < 0.27' be the condition that stops the process, and sets 'energy = 0'
#player defines the groups within which the updates are made
Run Code Online (Sandbox Code Playgroud)
这是我的桌子.
> field
time player prospects energy
1: 1 a 0.81 -0.32
2: 2 a 0.25 NA
3: 3 a …Run Code Online (Sandbox Code Playgroud)