【发布时间】:2020-02-25 02:12:57
【问题描述】:
我正在尝试使用 dplyr 管道末端的 for 循环对我的 df 子集进行一些计算,但我从 df 传递给 for 循环的变量无法识别。
我尝试按照这篇文章中的步骤进行操作: use for loop with pipes in R。 基本上,我将 for 循环包装在用户定义的函数中,并通过管道将 df 传递给函数。
我正在使用产品销售数据集,并尝试计算每个产品在每个季度内每对时期的平均销售额(促销的一种销售基准)。例如,我第一次遍历子集将计算周期 2 和 3 的平均值,省略 1。我的第二次遍历将排除周期 2 并计算 1 和 3 的平均销售额,等等。
#Create dataframe
Article <- rep(1:3, each = 6)
Quarter <- rep(1:2, each = 3, 3)
Period <- rep(1:3, 6)
Sales <- sample(10:20, 18, replace = T)
df <-data.frame(Article, Quarter, Period, Sales)
foo <- function(x){
for (i in unique(Period)) {
filter(Period != i) %>%
summarize(average_sales = mean(Sales))
}
return(x)
}
df <- df %>%
group_by(Article, Quarter) %>%
foo()
#Desired resultant df:
average_sales <- c(14.5, 16.5, 12, 12, 16, 15, 16.5, 12.5, 16, 15, 14, 18, 11.5, 11, 11.5, 16, 16, 12)
df$average_sales <- average_sales
print(df, row.names = F)
Article Quarter Period Sales average_sales
1 1 1 14 14.5
1 1 2 10 16.5
1 1 3 19 12.0
1 2 1 19 12.0
1 2 2 11 16.0
1 2 3 13 15.0
2 1 1 12 16.5
2 1 2 20 12.5
2 1 3 13 16.0
2 2 1 17 15.0
2 2 2 19 14.0
2 2 3 11 18.0
3 1 1 11 11.5
3 1 2 12 11.0
3 1 3 11 11.5
3 2 1 12 16.0
3 2 2 12 16.0
3 2 3 20 12.0
我知道这段代码仍然没有给出我的最终结果,理想情况下它是 df 中的第五个变量,其中包含每个时期的其他两个时期的平均销售额,但这就是我所在的地方卡住。我什至不确定 for 循环是否是解决这个问题的最佳/最有效的方法(我是一个有限的 R 编码器,不熟悉整套 tidyverse 工具),但是关于如何完成的任何建议数据框也将不胜感激。谢谢!
【问题讨论】:
-
你能举例说明预期的结果吗?
-
你的函数接受一个名为
x的参数。然后它在循环中执行一些不相关的事情(x未在循环中使用),从不分配任何内容(循环内没有<-或=),因此不会保存循环中发生的任何内容,并且然后它返回x,即未修改的输入。 (此评论的目的是试图帮助您了解为什么您的功能无法正常工作......我相信很快就会有人提出一个很好的解决方案。) -
@Gregor 感谢您的反馈。新手编码员在这里(因为所有中间编码员都表明自己,大声笑)。我假设 df 通过管道作为
x传递,但似乎并非如此。 -
df确实作为x传递给函数。但是你根本不会在函数内部使用x,除了在最后返回它。在你的 for 循环内部,在函数内部,你需要告诉filter使用x、x %>% filter...。但是您还需要将每个循环迭代的结果保存在某处。您运行了所有正确的计算,但由于您没有将它们分配给<-或=,因此它们不会被存储。 -
@LloydChristmas 完成。