r data.table:关于';由';((1)=.I和(2)=&x27;订购人&x27;)

r data.table:关于';由';((1)=.I和(2)=&x27;订购人&x27;),r,data.table,R,Data.table,我对package data.table中的“by”有两个问题 1) 如何将.I与它一起使用?例如,假设我们有一些用户在一天中的特定时间进入商店,我想要一个变量告诉我“我们看到这个用户的时间是多少?”。。。i、 e 理想的解决方案将产生 visitorId daytime howOftenHaveYouBeenHere 1: 1 1 1 2: 2 4 1 3:

我对package data.table中的“by”有两个问题

1) 如何将
.I
与它一起使用?例如,假设我们有一些用户在一天中的特定时间进入商店,我想要一个变量告诉我“我们看到这个用户的时间是多少?”。。。i、 e

理想的解决方案将产生

       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[,howeftenhaveyoubeenher:=.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!!!
但是这样做感觉不太好

2) 如何确保data.table按“时间”统计会话,即直到现在我都是这样做的

a) 相应地点餐

b) 执行“by”语句

这是正确的方法吗?还是可以在某个地方“偷偷地”输入SQL的订单

例如:如果我们从上面反转数据表
dt=data.table(visitorId=c(1,2,1,2,1),day=c(11,9,7,4,1))
然后

没有给出期望的结果。我们可以通过这样做来修复它:

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]
但是有没有一种“正确”的方法呢?即,在执行by语句时,是否保证订单保持不变

谢谢:-)


FW

.I
是整个表中的计数器,而不是按组。我们需要构造一个组内计数器:

dt[, seqobs := seq_along(.I), by=visitorId]
# or...
dt[, seqobs := seq_len(.N), by=visitorId]
# or...
dt[, seqobs := 1:.N, by=visitorId]

#    visitorId daytime seqobs
# 1:         1       1      1
# 2:         2       4      1
# 3:         1       7      2
# 4:         2       9      2
# 5:         1      11      3
这比初始化一列“1”并获取累积和要容易得多


数据需要在每个组内按
日间
进行排序,这样才有意义。如果不是

# example of an out-of-order table
dt2 <- dt[sample(.N)]

dt2[order(daytime), seqobs := seq(.N), by=visitorId]
#无序表的示例

DT2对不起,在玩你的解决方案的过程中被弄糊涂了:-现在清楚了吗?谢谢
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]
dt[, seqobs := seq_along(.I), by=visitorId]
# or...
dt[, seqobs := seq_len(.N), by=visitorId]
# or...
dt[, seqobs := 1:.N, by=visitorId]

#    visitorId daytime seqobs
# 1:         1       1      1
# 2:         2       4      1
# 3:         1       7      2
# 4:         2       9      2
# 5:         1      11      3
# example of an out-of-order table
dt2 <- dt[sample(.N)]

dt2[order(daytime), seqobs := seq(.N), by=visitorId]