首页 > 解决方案 > R Data.Table 将值复制到另一行

问题描述

我想根据某些条件将数据表的一行中的值复制到该数据表的另一行和另一列中。

这是我尝试过的代码,但在 点????,我不知道我应该在那里写什么。

dbData[direction == "Coming", GoingTime := (.SD[direction == "Going"][timestamp > ????][order(timestamp)][1])$timestamp, by="eqnr"]

对于方向=即将到来的每一行,我想获得方向=开始的下一行的时间戳。(对于 eqnr 中具有相同值的行)

我希望我能解释我的问题。我知道,我可以通过一些循环来解决问题,但我想利用 data.tables 的优势

这里有一些示例数据

标签: rdata.table

解决方案


D[, nextG := nafill(replace(seq_len(.N), direction == "C", NA), type="nocb"), by=.(eqnr)
  ][, timenextG := timestamp[nextG], by = .(eqnr)][]
#              timestamp direction  eqnr nextG           timenextG
#                 <POSc>    <char> <num> <int>              <POSc>
# 1: 2021-03-30 12:24:16         C    10     2 2021-03-30 13:05:59
# 2: 2021-03-30 13:05:59         G    10     2 2021-03-30 13:05:59
# 3: 2021-03-30 14:57:01         C    17     2 2021-03-30 14:59:29
# 4: 2021-03-30 14:59:29         G    17     2 2021-03-30 14:59:29
# 5: 2021-03-30 15:36:02         C    10     5 2021-03-30 16:25:29
# 6: 2021-03-30 15:41:02         C    10     5 2021-03-30 16:25:29
# 7: 2021-03-30 16:25:29         G    10     5 2021-03-30 16:25:29

数据

set.seed(2021)
D <- data.table(timestamp = sort(Sys.time() + runif(7, max=3600*10)), direction = c("C","G","C","G","C","C","G"), eqnr=c(10,10,17,17,10,10,10))
D
#              timestamp direction  eqnr
#                 <POSc>    <char> <num>
# 1: 2021-03-30 12:24:16         C    10
# 2: 2021-03-30 13:05:59         G    10
# 3: 2021-03-30 14:57:01         C    17
# 4: 2021-03-30 14:59:29         G    17
# 5: 2021-03-30 15:36:02         C    10
# 6: 2021-03-30 15:41:02         C    10
# 7: 2021-03-30 16:25:29         G    10

推荐阅读