这是关于data.table连接语法的一个哲学问题.我发现data.tables的用途越来越多,但仍在学习......
X[Y]data.tables 的连接格式非常简洁,方便和高效,但据我所知,它只支持内连接和右外连接.要获得左外部或全外部连接,我需要使用merge:
X[Y, nomatch = NA] - Y中的所有行 - 右外连接(默认)X[Y, nomatch = 0] - 只有在X和Y中都匹配的行 - 内连接merge(X, Y, all = TRUE) - 来自X和Y的所有行 - 完全外部连接merge(X, Y, all.x = TRUE) - X中的所有行 - 左外连接在我看来,如果X[Y]连接格式支持所有4种类型的连接,那将会很方便.有没有理由只支持两种类型的连接?
对我来说,nomatch = 0和nomatch = NA参数值对于正在执行的操作不是非常直观.这是我更容易理解和记忆的merge语法:all = TRUE,all.x = TRUE和all.y = TRUE.由于X[Y]操作类似于merge远远不止match,为什么不使用merge的连接,而不是语法match功能的nomatch参数?
以下是4种连接类型的代码示例:
# …Run Code Online (Sandbox Code Playgroud) 我需要进行时间序列计算,其中每行计算的值取决于前一行中计算的结果.我希望使用方便data.table.实际问题是水文模型 - 累积水量平衡计算,在每个时间步骤增加降雨量,减去径流和蒸发量作为当前水量的函数.数据集包括不同的盆地和场景(组).在这里,我将使用更简单的问题说明.
对于每个时间步(行),计算的简化示例如下所示i:
v[i] <- a[i] + b[i] * v[i-1]
Run Code Online (Sandbox Code Playgroud)
a并且b是参数值的向量,并且v是结果向量.对于第一行(i == 1)的初始值v取为v0 = 0.
我首先想到的是使用shift()在data.table.最小的例子,包括期望的结果v.ans,是
library(data.table) # version 1.9.7
DT <- data.table(a = 1:4,
b = 0.1,
v.ans = c(1, 2.1, 3.21, 4.321) )
DT
# a b v.ans
# 1: 1 0.1 1.000
# 2: 2 0.1 2.100
# 3: 3 0.1 3.210
# …Run Code Online (Sandbox Code Playgroud) 对于按站点分组的data.table DT,按时间t排序,我需要更改每个组中变量的最后一个值.我认为应该可以通过引用使用:=来做到这一点,但我还没有找到一种方法.
样本数据:
require(data.table) # using 1.8.11
DT <- data.table(site=c(rep("A",5), rep("B",4)),t=c(1:5,1:4),a=as.double(c(11:15,21:24)))
setkey(DT, site, t)
DT
# site t a
# 1: A 1 11
# 2: A 2 12
# 3: A 3 13
# 4: A 4 14
# 5: A 5 15
# 6: B 1 21
# 7: B 2 22
# 8: B 3 23
# 9: B 4 24
Run Code Online (Sandbox Code Playgroud)
期望的结果是更改每个组中a的最后一个值,例如更改为999,因此结果如下所示:
# site t a
# 1: A 1 11
# 2: A 2 12
# …Run Code Online (Sandbox Code Playgroud) 当使用X [Y]连接data.tables X和Y时,X必须有一个键,Y的键用来进行连接.如果X是一个非常大的表并且通常键入未在连接中使用的列,则需要为连接更改X的键,然后在连接后恢复为原始键.有没有一种有效的方法来进行连接,而不会丢失X上的原始主键?
我有一个大的时间序列环境数据集DT(1M行,36列),作为data.table,在站点和日期列上有键.我需要对DT中的现有列进行计算和/或使用小型查找或重新编码表基于现有列插入新列.
这是一个最小的例子:
require(data.table) # using v1.9.5
# main data table DT, keyed on site and date, with data column x
DT <- data.table(site = rep(LETTERS[1:2], each=3),
date = rep(1:3, times=2),
x = rep(1:3*10, times=2),
key = "site,date")
DT
# site date x
# 1: A 1 10
# 2: A 2 20
# 3: A 3 30
# 4: B 1 10
# 5: B 2 20
# 6: B 3 30
# lookup table for x …Run Code Online (Sandbox Code Playgroud)