我正在做一些记帐,但是然后想知道是否有更好的方法来替换长列表项的循环(CPU密集型)。
假设我们有一个这样的交易记录:
交易数据
Qty Date_purchase Price_purchase Date_sale Price_sale
5 01/11/2020 ??? 02/11/2020 ???
10 03/11/2020 ??? 05/11/2020 ???
5 03/11/2020 ??? 06/11/2020 ???
....
我要做的是填充??? 价格根据此列表中的日期。
价格表
Date Price
01/11/2020 10
02/11/2020 15
03/11/2020 17
....
我已经尝试过合并,联接,但是在用R中的tidyverse编写代码时遇到了麻烦(如果代码工作更快,可以切换到Python)。
transaction_data
%>% transaction_data$Price_purchase <- left_join(price_list, by = c('Date_purchase', 'Date')
%>% transaction_data$Price_sale <- left_join(price_list, by = c('Date_sale', 'Date') (not working)
编辑:所有的解决方案都是平等的,我希望我可以选择所有作为正确答案
如果需要for
循环,则循环遍历“ transaction_date”中“ Date”列的向量,left_join
使用“ price_list”,mutate
将“ Price_purchase”作为“ price_list”中的“ Price”列,然后删除该列
library(dplyr)
nm1 <- c("Date_purchase", "Date_sale")
for(nm in nm1) {
transaction_date <- left_join(transaction_date, price_list,
by = setNames('Date', nm)) %>%
mutate(Price_purchase = Price) %>%
select(-Price)
}
如果日期联接在一个范围内,则在将“日期”列转换为Date
类后,我们可以使用非等距联接
library(data.table)
nm1 <- c('Date_purchase', 'Date_sale')
setDT(transaction_date)[, nm1 :=
lapply(.SD, as.IDate, format = "%d/%m/%Y"), .SDcols = nm1]
setDT(price_list)[, Date := as.IDate(Date, "%d/%m/%Y")]
transaction_date[price_list, Price_purchase :=
Price, on = .(Date_purchase >= Date, Date_sale <= Date)]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句