【发布时间】:2015-07-02 14:29:49
【问题描述】:
我对包 data.table 中的“by”有两个问题。
1) 如何将.I 与它一起使用?例如,假设我们有用户在一天中的某些时间进入商店,我想要一个变量告诉我“我们看到这个用户的时间是多少?”......即
> library(data.table)
> dt = data.table(visitorId = c(1,2,1,2,1), daytime=c(1,4,7,9,11))
> dt
visitorId daytime
1: 1 1
2: 2 4
3: 1 7
4: 2 9
5: 1 11
所需的解决方案会产生
visitorId daytime howOftenHaveYouBeenHere
1: 1 1 1
2: 2 4 1
3: 1 7 2
4: 2 9 2
5: 1 11 3
现在我玩了 data.table 的 .I 并没有给我想要的东西:我(:-) 抱歉,无法抗拒)期望工作的是 dt = dt[, howOftenHaveYouBeenHere := .I, by=visitorId] 但这给了
visitorId daytime howOftenHaveYouBeenHere
1: 1 1 1
2: 2 4 1
3: 1 7 2
4: 2 9 2
5: 1 11 1 <---- not a 3 here!!!
我让它工作了
dt = dt[, stupid := 1]
dt = dt[, session := cumsum(stupid), by=visitorId]; print(dt)
但是这样做感觉不太好……
2) 如何确保 data.table 按“时间”计算会话数,即直到现在我都这样做了
a) 相应地对表格进行排序
b) 执行'by'语句
这是正确的方式还是可以在某处“偷运”SQL 的“ORDER BY”?
例如:如果我们从上面反转数据表
dt = data.table(visitorId = c(1,2,1,2,1), daytime=c(11,9,7,4,1))
那么
dt = dt[, stupid := 1]
dt = dt[, session := cumsum(stupid), by=visitorId]; print(dt)
没有给出想要的结果。我们可以这样修复它:
dt = data.table(visitorId = c(1,2,2,1,1), dayTime=c(11,9,4,7,1))
dt = dt[order(dayTime, decreasing=FALSE)]
dt = dt[, stupid := 1]
dt = dt[, howOftenHaveYouBeenHere := cumsum(stupid), by=visitorId]
但是有没有“正确”的方法呢? IE。执行副语句时是否保证订单保持不变?
谢谢:-)
FW
【问题讨论】:
-
抱歉,在玩您的解决方案时感到困惑并陷入困境 :-) 现在清楚了吗?
-
是的,有道理。谢谢
标签: r data.table