gpt4 book ai didi

r - 在 R 中优化复杂的 data.table 聚合

转载 作者:行者123 更新时间:2023-12-03 16:53:33 25 4
gpt4 key购买 nike

How to optimise filtering and counting for every row in a large R data frame 开始

我有一个 data.table 如下所示:

  name day wages hour colour
1 Ann 1 100 6 Green
2 Ann 1 150 18 Blue
3 Ann 2 200 10 Blue
4 Ann 3 150 10 Green
5 Bob 1 100 11 Red
6 Bob 1 200 17 Red
7 Bob 1 150 20 Green
8 Bob 2 100 11 Red

对于每个唯一的名称/日期对,我想知道四个时间段之一的一些事实。我关心的时间段是:

t1 (hour < 9) 
t2 (hour < 17)
t3 (hour > 9)
t4 (hour > 17)

事实的一些例子可能是:

wages > 175
colour = "Green"

我可以使用以下 data.table 过滤器完成此操作

setkey(dt,name,day)
result <- dt[,list(wages.t1=sum(wages>175&hour<9),
wages.t2=sum(wages>175&hour<17),
wages.t3=sum(wages>175&hour>9),
wages.t4=sum(wages>175&hour>17),
green.t1=sum(colour=="Green"&hour<9),
green.t2=sum(colour=="Green"&hour<17),
green.t3=sum(colour=="Green"&hour>9),
green.t4=sum(colour=="Green"&hour>17)),

列表(姓名,日期)]

给我

     name day wages.t1 wages.t2 wages.t3 wages.t4 green.t1 green.t2 green.t3 green.t4
[1,] Ann 1 0 0 0 0 1 1 0 0
[2,] Ann 2 0 1 1 0 0 0 0 0
[3,] Ann 3 0 0 0 0 0 1 1 0
[4,] Bob 1 0 0 1 0 0 0 1 1
[5,] Bob 2 0 0 0 0 0 0 0 0

但这 a) 读和写很糟糕 b) 看起来效率低下。

关于我如何做得更好的任何提示?请注意,在我的真实场景中,我有数十万行、四个时间段和每个时间段 30-35 个事实。

-- 创建dt

的代码
dt = data.table(
name = factor(c("Ann", "Ann", "Ann", "Ann",
"Bob", "Bob", "Bob", "Bob")),
day = c(1, 1, 2, 3, 1, 1, 1, 2),
wages = c(100, 150, 200, 150, 100, 200, 150, 100),
hour = c(6, 18, 10, 10, 11, 17, 20, 11),
colour = c("Green", "Blue", "Blue", "Green", "Red",
"Red", "Green", "Red")
)

最佳答案

怎么样:

f = list(quote(wages>175),quote(colour=="Green"))
t = list(quote(hour<9),quote(hour<17),quote(hour>9),quote(hour>17))
dt = as.data.table(df)
dt[,as.list(mapply("%*%",
lapply(t,eval,.SD),
rep(lapply(f,eval,.SD),each=length(t))
)), by=list(name,day)]
name day V1 V2 V3 V4 V5 V6 V7 V8
[1,] Ann 1 0 0 0 0 1 1 0 0
[2,] Ann 2 0 1 1 0 0 0 0 0
[3,] Ann 3 0 0 0 0 0 1 1 0
[4,] Bob 1 0 0 1 0 0 0 1 1
[5,] Bob 2 0 0 0 0 0 0 0 0

很明显,列名没有被处理,但如果这种方法可行,可以添加。

这应该更有效,因为每个 t 和每个 f 每组仅计算一次,然后组合这些结果的组合。

关于r - 在 R 中优化复杂的 data.table 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10212275/

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