r - R Data.Table 将值复制到另一行
问题描述
我想根据某些条件将数据表的一行中的值复制到该数据表的另一行和另一列中。
这是我尝试过的代码,但在 点????
,我不知道我应该在那里写什么。
dbData[direction == "Coming", GoingTime := (.SD[direction == "Going"][timestamp > ????][order(timestamp)][1])$timestamp, by="eqnr"]
对于方向=即将到来的每一行,我想获得方向=开始的下一行的时间戳。(对于 eqnr 中具有相同值的行)
我希望我能解释我的问题。我知道,我可以通过一些循环来解决问题,但我想利用 data.tables 的优势
解决方案
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
推荐阅读
- java - 比较两个不同的文本文件并替换相似的词
- sql - 按部分字符串分组
- excel - 引用定义范围内的特定单元格时出现错误 1004
- ansible - 使用循环和检查创建用户的 Ansible 任务
- typescript - 从 TypeScript 中函数的返回值派生类型
- php - 在 Laravel 中优化块
- google-drive-api - Google Drive API:如何查找*未*与我共享的文件?
- docker - docker中codeigniter的Nginx服务器配置,多个应用程序
- python - 密码书写系统:标准输出不再起作用
- laravel - 在 Laravel 中连接两个属性后如何在数据库中搜索值