作者celestialgod (攸蓝)
看板R_Language
标题Re: [问题] 快速产生column, 和前几个row相依
时间Sat Aug 30 07:20:19 2014
可以试试看tapply做 会比回圈再快一点
我自己模拟了一笔13000左右的资料只比回圈快1.86倍
我有试过把比过的跳掉,可是发现变更慢
还在想有没有什麽方法更快
code:
data$Session = unlist(tapply(data$Time, data$ID, function(v){
output = rep(0, length(v))
i = 1
session_num = 1
repeat
{
loc = as.numeric(v - v[i], unit='hours') < 1 & output == 0
output[loc] = session_num
session_num = session_num + 1
i = i + sum(loc)
if(i > length(v))
break
}
output
}))
模拟资料:
set.seed(100)
n = 2100
data = data.frame(ID = rep(1:n, ceiling(runif(n) * 10) + 1))
nrow(data)
# 13812
data$Time = Reduce(c, tapply(rep(1, nrow(data)), data$ID, function(v){
start_time = strptime("2014-08-01 00:00:00", "%Y-%m-%d %H:%M:%S")
as.POSIXlt(sort(start_time + round(86400 * runif(length(v)))))
}))
回圈:5.301304 secs
tapply: 2.846163 secs
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.164.193.78
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/R_Language/M.1409354422.A.A2C.html
1F:推 forloricever: 感谢! 来试试 08/30 07:24
不客气,只是你的回圈版本跑出来的结果是错的,你可能要检查一下你有没有贴错。
2F:→ forloricever: 可能有贴错, 砍了改了一些 code 08/30 07:29
恩
※ 编辑: celestialgod (218.164.193.78), 08/30/2014 07:42:53
3F:→ forloricever: 已修正 08/30 08:05
4F:推 forloricever: 可再请问tapply如何产生在一次loop 生二个 column? 08/30 08:09
5F:→ forloricever: ex有个 col:Date 把同一个ID, session 都设为第一个 08/30 08:10
6F:推 bxxl: 你时间转成POSIXct,不要用POSIXlt, 大概还可以降一半 08/30 23:18
7F:推 bxxl: 再把时间差改成difftime(v, v[i], unit='hours') < 1 08/30 23:37