如何使用带有dplyr的管道将数据帧变量传递给for循环?
我试图在dplyr管道末端使用for循环对df的子集进行迭代计算,但是从df传递到for循环的变量无法识别 我试着按照这篇文章中的步骤来做: . 基本上,我将for循环包装在一个用户定义的函数中,并通过管道将df传递给该函数 我正在使用一个产品销售数据集,并试图计算每个季度内每对产品的平均销售额(一种促销的销售基线)。例如,我第一次通过子集将计算周期2和3的平均值,忽略1。我的第二次通过将排除第2阶段,并计算第1和第3阶段的平均销售额,以此类推如何使用带有dplyr的管道将数据帧变量传递给for循环?,r,dataframe,dplyr,R,Dataframe,Dplyr,我试图在dplyr管道末端使用for循环对df的子集进行迭代计算,但是从df传递到for循环的变量无法识别 我试着按照这篇文章中的步骤来做: . 基本上,我将for循环包装在一个用户定义的函数中,并通过管道将df传递给该函数 我正在使用一个产品销售数据集,并试图计算每个季度内每对产品的平均销售额(一种促销的销售基线)。例如,我第一次通过子集将计算周期2和3的平均值,忽略1。我的第二次通过将排除第2阶段,并计算第1和第3阶段的平均销售额,以此类推 #Create dataframe Article
#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
#创建数据帧
文章如果我们正在寻找一种方法来获得特定“期间”除“销售额”以外的元素的平均值,则获得“销售额”与每个“文章”、“季度”的“销售额”总和的差值,并除以组长度-1
library(dplyr)
df %>%
group_by(Article, Quarter) %>%
mutate(average_sales = (sum(Sales)- Sales)/(n()-1))
# A tibble: 18 x 5
# Groups: Article, Quarter [6]
# Article Quarter Period Sales average_sales
# <int> <int> <int> <int> <dbl>
# 1 1 1 1 14 14.5
# 2 1 1 2 10 16.5
# 3 1 1 3 19 12
# 4 1 2 1 19 12
# 5 1 2 2 11 16
# 6 1 2 3 13 15
# 7 2 1 1 12 16.5
# 8 2 1 2 20 12.5
# 9 2 1 3 13 16
#10 2 2 1 17 15
#11 2 2 2 19 14
#12 2 2 3 11 18
#13 3 1 1 11 11.5
#14 3 1 2 12 11
#15 3 1 3 11 11.5
#16 3 2 1 12 16
#17 3 2 2 12 16
#18 3 2 3 20 12
库(dplyr)
df%>%
分组依据(条款、季度)%>%
变异(平均销售额=(总和(销售额)-销售额)/(n()-1))
#一个tibble:18x5
#分组:文章,季度[6]
#第四条季度平均销售额
#
# 1 1 1 1 14 14.5
# 2 1 1 2 10 16.5
# 3 1 1 3 19 12
# 4 1 2 1 19 12
# 5 1 2 2 11 16
# 6 1 2 3 13 15
# 7 2 1 1 12 16.5
# 8 2 1 2 20 12.5
# 9 2 1 3 13 16
#10 2 2 1 17 15
#11 2 2 2 19 14
#12 2 2 3 11 18
#13 3 1 1 11 11.5
#14 3 1 2 12 11
#15 3 1 3 11 11.5
#16 3 2 1 12 16
#17 3 2 2 12 16
#18 3 2 3 20 12
数据
df如果我们正在寻找一种方法来获得特定“期间”除“销售额”以外的元素的平均值
,则获得“销售额”与每个“物品”、“季度”的“销售额”的总和
之差,并除以组长度-1
library(dplyr)
df %>%
group_by(Article, Quarter) %>%
mutate(average_sales = (sum(Sales)- Sales)/(n()-1))
# A tibble: 18 x 5
# Groups: Article, Quarter [6]
# Article Quarter Period Sales average_sales
# <int> <int> <int> <int> <dbl>
# 1 1 1 1 14 14.5
# 2 1 1 2 10 16.5
# 3 1 1 3 19 12
# 4 1 2 1 19 12
# 5 1 2 2 11 16
# 6 1 2 3 13 15
# 7 2 1 1 12 16.5
# 8 2 1 2 20 12.5
# 9 2 1 3 13 16
#10 2 2 1 17 15
#11 2 2 2 19 14
#12 2 2 3 11 18
#13 3 1 1 11 11.5
#14 3 1 2 12 11
#15 3 1 3 11 11.5
#16 3 2 1 12 16
#17 3 2 2 12 16
#18 3 2 3 20 12
库(dplyr)
df%>%
分组依据(条款、季度)%>%
变异(平均销售额=(总和(销售额)-销售额)/(n()-1))
#一个tibble:18x5
#分组:文章,季度[6]
#第四条季度平均销售额
#
# 1 1 1 1 14 14.5
# 2 1 1 2 10 16.5
# 3 1 1 3 19 12
# 4 1 2 1 19 12
# 5 1 2 2 11 16
# 6 1 2 3 13 15
# 7 2 1 1 12 16.5
# 8 2 1 2 20 12.5
# 9 2 1 3 13 16
#10 2 2 1 17 15
#11 2 2 2 19 14
#12 2 2 3 11 18
#13 3 1 1 11 11.5
#14 3 1 2 12 11
#15 3 1 3 11 11.5
#16 3 2 1 12 16
#17 3 2 2 12 16
#18 3 2 3 20 12
数据
df将我的评论转化为答案,并通过一些简化示例帮助您了解如何修复您的函数:
foo1 <- function(x) {
1 + 2
return(x)
}
foo1(0)
# [1] 0
foo2
稍微好一点,但最终同样毫无意义。中间的计算使用<代码> x>代码>,这是逻辑上向前迈进的一步,但是结果,<代码> x+ 1 < /代码>没有被保存,并且函数仍然返回传入的原始<代码> x>代码>
foo3 <- function(x) {
y <- x + 1
return(y)
}
foo3(0)
# [1] 1
foo4
显示了初学者常见的错误-y
在循环中每次都被修改,但每次都被覆盖y
将是x+1
,第一次通过,然后y
将是x+2
,然后当i
为3时y
将是x+3
,没有上一次迭代的内存。我们需要给y
一些长度,以便它可以单独存储每个迭代
foo5 <- function(x) {
y <- numeric(3)
for(i in 1:3) {
y[i] <- x + i
}
return(y)
}
foo5(0)
# [1] 1 2 3
将我的评论转化为答案,并提供一些简化示例,以帮助您了解如何修复功能:
foo1 <- function(x) {
1 + 2
return(x)
}
foo1(0)
# [1] 0
foo2
稍微好一点,但最终同样毫无意义。中间的计算使用<代码> x>代码>,这是逻辑上向前迈进的一步,但是结果,<代码> x+ 1 < /代码>没有被保存,并且函数仍然返回传入的原始<代码> x>代码>
foo3 <- function(x) {
y <- x + 1
return(y)
}
foo3(0)
# [1] 1
foo4
显示了初学者常见的错误-y
在循环中每次都被修改,但每次都被覆盖y
将是x+1
,第一次通过,然后y
将是x+2
,然后当i
为3时y
将是x+3
,没有上一次迭代的内存。我们需要给y
一些长度,以便它可以单独存储每个迭代
foo5 <- function(x) {
y <- numeric(3)
for(i in 1:3) {
y[i] <- x + i
}
return(y)
}
foo5(0)
# [1] 1 2 3
您能否将预期结果显示为示例?您的函数采用一个名为x
的参数。然后它在循环中做一些不相关的事情(x
没有在循环中使用),从不分配任何东西(没有@Gregor,谢谢你的反馈。这里是新手程序员(因为所有中间程序员都表明了自己的身份,哈哈)。我假设df是通过管道以x
的形式传递给函数的,但事实并非如此。df
确实是以x
的形式传递给函数的。但是,在函数内部根本不使用x
,除非在最后返回它。在for循环内部,在