【发布时间】:2018-12-04 09:16:24
【问题描述】:
我正在为我的问题寻找优化的解决方案,我确实有解决方案,但需要时间。
有 2 个数据框:
Df1:
Hid MST Date Percent year_1_back Avg_Percent
1 1 01-01-2018 .90 01-01-2017 0
DF1 共有 19,900 条记录
DF2:
Hid MST Date Percent
1 1 01-01-2017 .90
1 1 02-01-2017 .91
我在 DF2 中的数据直到今天
所以,现在我想更新 DF1 中的 Avg_Percent 列,方法是从 DF2 中获取 1 年的数据以及百分比的平均值。
现有逻辑:
for(row in 1:nrow(DF1)){
#row = 1
hid <- DF1[row,]$hid
mst <- DF1[row,]$mst
startdate <- DF1[row,]$year_1_back
enddate <- DF1[row,]$Date
test1 <- DF2[which(DF2$Date>= startdate & DF2$Date<= enddate & DF2$MarketSegmentType == mst & DF2$hid== hid),]
AVG <- mean(test1$Percet)
DF1[row,]$Avg_Percent <- AVG
}
这给了我结果,但执行需要很长时间。我认为 dplyr 会很有用,但不知道如何使用该功能。
我正在寻找一些比现有代码更快的代码。
【问题讨论】:
-
一般来说,
purrr包中的map函数是替换for-loop 的好选择 -
你有什么例子,我可以举个例子吗?
-
请注意,
purrr系列函数(如*apply系列)只是隐藏了 for 循环,只是为了清楚起见。 -
对不起,我误读了您的第一条评论,尝试添加有关您的数据的更多详细信息,一个可重复的示例应该会有所帮助。在小样本上尝试使用
dput。 -
如果没有更大的测试数据样本,很难提供帮助,但这可以通过以下步骤在
dplyr中快速轻松地完成:首先使用DF1将time_period变量分配给DF2中的每个观察结果。然后,在DF2上,使用group_by(hid, mst, time_period)和summarisewith function = mean 来获得所需的结果。