小编Dou*_*ark的帖子

为什么X [Y]连接data.tables不允许完全外连接或左连接?

这是关于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 = 0nomatch = NA参数值对于正在执行的操作不是非常直观.这是我更容易理解和记忆的merge语法:all = TRUE,all.x = TRUEall.y = TRUE.由于X[Y]操作类似于merge远远不止match,为什么不使用merge的连接,而不是语法match功能的nomatch参数?

以下是4种连接类型的代码示例:

# …
Run Code Online (Sandbox Code Playgroud)

join r data.table

115
推荐指数
3
解决办法
3万
查看次数

如何在data.table中编写累积计算

连续的累积计算

我需要进行时间序列计算,其中每行计算的值取决于前一行中计算的结果.我希望使用方便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)

r time-series vectorization difference-equations data.table

15
推荐指数
1
解决办法
749
查看次数

如何在data.table中通过引用更改每个组中的最后一个值

对于按站点分组的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)

r data.table

9
推荐指数
1
解决办法
1082
查看次数

如何进行X [Y] data.table连接,而不会丢失X上的现有主键?

当使用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)

r data.table

6
推荐指数
2
解决办法
845
查看次数