[问题] 快速产生column, 和前几个row相依

楼主: forloricever (sigh...)   2014-08-30 05:03:43
[问题类型]:
效能咨询(我想让R 跑更快)
[软件熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
有一组 data 已照 ID, Time 排序
需要产生一个 column (Session),
将相隔一固定时间 (1hr) 内的算在同一个 Session。
Ex:
ID Time Session
1 2014-08-28 00:00:00 1
1 2014-08-28 00:23:33 1
1 2014-08-28 00:59:59 1
1 2014-08-28 01:00:00 2
1 2014-08-28 02:30:00 3
1 2014-08-28 03:29:59 3
2 2014-08-28 00:00:01 1
每个列和前几列相依且未知有几列,
似乎只能用 for loop 做一次 linear scan,
资料量约 1~10 万 rows/day, 要处理好几个月的资料。
不晓得有什么好方法?
目前 13000 rows 约花 3.5 sec, 用 compiler 套件加速到 3.3 sec
data.table 极慢, 要 30 sec
用 python 的 pandas 套件用同样的方法写 for loop
只要 600 ms。
希望 R 至少能做到和 python 速度类似。
[程式范例]:
张贴能够重现错误的程式码,可以帮助版友更快的帮你解决问题
目前产生新 column 大概是这样
data$Session <- 0
id <- data[1, 'ID']
session.start <- data[1, 'Time']
data[1, 'Session'] <- 1
for (row in 2:nrow(data)) {
if (id != data[row, 'ID']) {
session.start <- data[row, 'Time']
data[row, 'Session'] <- 1
id <- data[row, 'ID']
} else {
if (as.numeric(data[row, 'Time'] -
data[row-1, 'Time'], unit='hours') >= 1) {
# Start a new session
data[row, 'Session'] <- data[row-1, 'Session']+1
session.start <- data[row, 'Time']
} else {
data[row, 'Session'] <- data[row-1, 'Session']
}
}
}
作者: gsuper (Logit(odds))   2014-08-31 21:54:00
1. 把时间全部换算成秒 2. 每小时就是3600秒用这个逻辑去判断 就可以很快strsplit(data[,"Time"]," |:|-",fixed=FALSE)as.numeric()比方说 你的 Time 是 c(1秒,3599秒,3601秒)直接除以3600后 取 trunc()就可以得到 category

Links booklink

Contact Us: admin [ a t ] ucptt.com