Re: [问题] 用不同条件抓data

楼主: andrew43 (讨厌有好心推文后删文者)   2017-08-08 03:29:35
这用 data.table 很容易解。
library(data.table)
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
"
)
# 一个简单的 function 回传初值与其它前后差
funcDelta <- function(x) {
baseline <- min(x)
delta <- diff(x)
# 或是 delta <- diff(sort(x))
return(c(baseline, delta))
}
# try funcDelta
funcDelta(c(1,4,6,7)) # return c(1,3,2,1)
# 以下为所求
dt[,
.(deltaTravelTime = funcDelta(TravelTime), Toward),
by = UniqueID]
# UniqueID deltaTravelTime Toward
# 1: BB02 104 B1
# 2: BB02 127 B2
# 3: BB02 14 B3
# 4: BB02 23 B4
# 5: BB02 45 B5
# 6: AA02 31 A1
# 7: AA02 52 A2
# 8: AA02 89 A3
# 9: AA02 26 A4
# 10: AA02 78 A5
※ 引述《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
:
: [环境叙述]:
:
:
: [关键字]:
:
: 选择性,也许未来有用
:
作者: cywhale (cywhale)   2017-08-08 08:58:00
推~也可用data.table中提供shift(...,fill=0) 道理一样~
作者: joson4921 (特务)   2017-08-08 19:12:00
谢谢andrew43大大的提点,下午有成功改出来了;也谢谢c大大提供的建议

Links booklink

Contact Us: admin [ a t ] ucptt.com