gpt4 book ai didi

r data.table : two questions about 'by' ((1)=. I 和 (2) ='order by' )

转载 作者:行者123 更新时间:2023-12-04 02:20:02 24 4
gpt4 key购买 nike

我有两个关于包 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 并没有给我想要的东西: .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 按“时间”对 session 进行计数,即直到现在我都是这样做的

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。是否保证在执行 by-statement 时顺序保持不变?

谢谢:-)

转发

最佳答案

.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 并求和更容易。


为了使数据有意义,需要在每个组内按 daytime 对数据进行排序。如果不是...

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

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

顺便说一句,如果你想改变一个data.table的顺序,使用setorder函数。

(在data.table包的下一个版本,1.9.8,会有一个小快捷方式dt[, seqobs := rowidv(visitorId)]。我做这个笔记是这样的我可以稍后更新答案。)

关于r data.table : two questions about 'by' ((1)=. I 和 (2) ='order by' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31187364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com