作者forloricever (sigh...)
看板R_Language
标题[问题] 快速产生column, 和前几个row相依
时间Sat Aug 30 05:03:43 2014
[问题类型]:
效能谘询(我想让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']
}
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 66.228.162.44
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/R_Language/M.1409346226.A.6EB.html
※ 编辑: forloricever (66.228.162.44), 08/30/2014 05:05:08
※ 编辑: forloricever (66.228.162.44), 08/30/2014 05:05:51
※ 编辑: forloricever (66.228.162.44), 08/30/2014 05:06:53
※ 编辑: forloricever (66.228.162.44), 08/30/2014 05:10:52
※ 编辑: forloricever (66.228.162.44), 08/30/2014 08:05:48
1F:→ gsuper: 1. 把时间全部换算成秒 2. 每小时就是3600秒 08/31 21:54
2F:→ gsuper: 用这个逻辑去判断 就可以很快 08/31 21:55
3F:→ gsuper: strsplit(data[,"Time"]," |:|-",fixed=FALSE) 08/31 21:56
4F:→ gsuper: as.numeric() 08/31 21:57
5F:→ gsuper: 比方说 你的 Time 是 c(1秒,3599秒,3601秒) 08/31 22:05
6F:→ gsuper: 直接除以3600後 取 trunc()就可以得到 category 08/31 22:05