gpt4 book ai didi

r - 遍历多个表并仅在满足条件时保留的方法?

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

所以我正在研究具有多个数据表的项目,按月分隔,我需要遍历这些数据表。速度在这里至关重要,除非我通过数据表函数进行大量交叉连接,否则我似乎无法将时间缩短到合理的程度。所以这是我的表:
表格1

Product Date        Cost
A 8/1/2020 10
A 8/2/2020 20
A 8/3/2020 30
B 8/4/2020 15
B 8/5/2020 25
B 8/6/2020 35
和表 2:
Product Date    Price
A 9/1/2020 20
A 9/2/2020 30
A 9/3/2020 40
B 9/4/2020 27
B 9/5/2020 33
B 9/6/2020 42
所以我需要迭代表 2 价格 - 表 1 成本的每个组合,并按产品进行。所以输出将是:
新表
Product Date1         Date2          Profit
A 8/1/2020 9/1/2020 10
A 8/1/2020 9/2/2020 20
...
编辑:为了澄清,新表应该继续。假设产品 A 应该有 27 种不同的利润(A x 3 折扣率下的 3 个日期),假设它们都高于 0。如果任何利润低于 0,那么我不希望它们作为新产品的一部分 table 。
我还有一个折扣因子,我需要将其应用于价格的每个排列,因为我们提供了相当多的折扣
Discount = c(10%,12%,18%)
我试过使用循环和各种使用 apply 的方法,但循环需要很长时间才能完成(几个小时,有些从来没有)。这些组合导致数百万行,但我只想保留有利可图的行,其中价格 * 折扣 > 成本,数量可能只有 10,000。
我的解决方案是交叉连接数据表以创建一个我可以对其进行矢量化的大型表,这要快得多(大约 1 分钟),但是对于一些较大的表,我很快就会遇到内存限制,而且它的可扩展性不是很好。
CTbl =setkey(CTbl[,c(k=1,.SD)],k)[Price[,c(k=1,.SD)],allow.cartesian=TRUE][,k:=NULL]
CTbl[,Profit:=(Discount*Price - Cost]
CTbl = setDT(CTbl)[, .SD[Price > Cost ]]
DT = CTbl[,list(MinProfit = min(Profit)),by = Product]
当然,这是相当快的,但是当我真正想要的只是有利可图的行,当然还有持续的内存问题时,会浪费大量内存。
任何人都可以帮忙吗?我问过一些工作中的 R 用户,但他们似乎也被难住了,他们制作的循环无法接近运行上述代码所需的 5 分钟以下。如果这意味着我可以扩大规模,我不介意额外的时间。
谢谢!

最佳答案

这听起来像是 dplyr 的问题包,其中。 dplyr package 允许您将数据操作串在一个“管道”中,以避免将内容存储在内存中。管道运算符(operator) %>%获取左侧函数的输出并将其用作右侧函数的第一个参数。 dplyr中的每个函数包适用于整个向量或数据tibble,因此不需要循环。
因此,您的操作可能如下所示:

# Initialize random data like your first table
df1 <- data.frame(product = sample(LETTERS[1:10], 10000, replace = TRUE),
date1 = sample(seq(as.Date("2020/08/01"), as.Date("2020/08/31"),
by = "day"), 10000, replace = TRUE),
cost = round(runif(10000, 5, 100)))
# Initialize random data like your second table
df2 <- data.frame(product = sample(LETTERS[1:10], 10000, replace = TRUE),
date2 = sample(seq(as.Date("2020/09/01"), as.Date("2020/09/30"),
by = "day"), 10000, replace = TRUE),
price = round(runif(10000, 5, 100)))
# Initialize discounts
discounts <- data.frame(product = rep(LETTERS[1:10],4),
discount = rep(c(0, 0.1, 0.12, 0.18), 10))
library(dplyr)
out_table <- df1 %>%
full_join(df2) %>%
full_join(discounts) %>%
mutate(profit = price * discount - cost) %>%
filter(profit > 0)
对于我的随机数据,这在我的机器上大约需要 3 秒。此外, filter动词只保留我们想要的那些行。

关于r - 遍历多个表并仅在满足条件时保留的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63207515/

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