※ 引述《joson4921 (特务)》之铭言:
:
: - 问题: 当你想要问问题时,请使用这个类别。
:
: [问题类型]:
:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
:
: [软件熟悉度]:
:
: 入门(写过其他程式,只是对语法不熟悉)
:
: [问题叙述]:
: 请简略描述你所要做的事情,或是这个程式的目的
: 手边有资料 df 如下:
: Goback Toward TravelTime UniqueID
: 1 A1 32 AA01
: 1 A2 47 AA01
: 1 A3 83 AA01
: 1 A4 122 AA01
: 1 A5 143 AA01
: 0 B1 284 BB01
: 0 B2 302 BB01
: 0 B3 419 BB01
: 0 B4 492 BB01
: 0 B5 701 BB01
: 0 B1 104 BB02
: 0 B2 231 BB02
: 0 B3 245 BB02
: 0 B4 268 BB02
: 0 B5 313 BB02
: 1 A1 31 AA02
: 1 A2 83 AA02
: 1 A3 172 AA02
: 1 A4 198 AA02
: 1 A5 276 AA02
: 希望用同一 UniqueID 字段的五笔资料,算出他们之间 TravelTime 的时间差(秒数)
: 并新增 TT_diff 字段容纳其结果,但这边有个问题
: 因为 5笔 TravelTime资料只能产出 4个 时间差(秒数)
: 以 UniqueID == AA02 为例,产出之TT_diff字段结果如下
: (第一笔 TT_diff = 83-31 = 52, 以此类推)
: TT_diff
: 52
: 89
: 26
: 78
: 但我希望产出的结果能够长得像这样
: 也用 UniqueID == AA02 的第一笔资料(TravelTime = 31)塞进去 TT_diff 字段
: 后面再接上面产出的4个时间差,像下面这样:
: TT_diff(我想要的结果)
: 31
: 52
: 89
: 26
: 78
: 因为之前用 [, := ] 跑运算(好像是magrittr?)没有跑过这种同时设定两种条件的
: 用别的方法试了两天,弄不出我想要的结果,
: 如底下程式码所示,那个31没办法出现在第一列.而且最后一列会出现NA
: 请问板上大大,如果要产出上面我想要的结果,程式码该怎么修正,谢谢!!
: [程式范例]:
:
: <我的程式码>
: result <- df[ , .(TT_diff = TravelTime[2L:5L]-TravelTime[1L:4L] ),
: by=.(UniqueID)]
: TT_diff(跑出来的结果,跟想要的差很多)
: 52
: 89
: 26
: 78
: NA
:
: [环境叙述]:
:
:
: [关键字]:
:
: 选择性,也许未来有用
:
我的做法,参考看看:
library(data.table)
library(dplyr)
library(magrittr)
dt <- fread(
"Goback Toward TravelTime UniqueID
0 B1 104 BB02
0 B2 231 BB02
0 B3 245 BB02
0 B4 268 BB02
0 B5 313 BB02
1 A1 31 AA02
1 A2 83 AA02
1 A3 172 AA02
1 A4 198 AA02
1 A5 276 AA02
"
) %>% tbl_df()
dt %>% group_by(UniqueID) %>%
mutate(seq = order(Toward),
lagTime = lag(TravelTime)) %>%
ungroup() %>%
mutate(TT_diff = TravelTime - lagTime) %>%
mutate(TT_diff = ifelse(seq == 1, TravelTime, TT_diff)) %>%
select(-seq, -lagTime)