r data.table:关于';由';((1)=.I和(2)=&x27;订购人&x27;)
我对package data.table中的“by”有两个问题 1) 如何将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:
.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]