如何使用带有dplyr的管道将数据帧变量传递给for循环?

如何使用带有dplyr的管道将数据帧变量传递给for循环?,r,dataframe,dplyr,R,Dataframe,Dplyr,我试图在dplyr管道末端使用for循环对df的子集进行迭代计算,但是从df传递到for循环的变量无法识别 我试着按照这篇文章中的步骤来做: . 基本上,我将for循环包装在一个用户定义的函数中,并通过管道将df传递给该函数 我正在使用一个产品销售数据集,并试图计算每个季度内每对产品的平均销售额(一种促销的销售基线)。例如,我第一次通过子集将计算周期2和3的平均值,忽略1。我的第二次通过将排除第2阶段,并计算第1和第3阶段的平均销售额,以此类推 #Create dataframe Article

我试图在dplyr管道末端使用for循环对df的子集进行迭代计算,但是从df传递到for循环的变量无法识别

我试着按照这篇文章中的步骤来做: . 基本上,我将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
#创建数据帧

文章如果我们正在寻找一种方法来获得特定“期间”除“销售额”以外的元素的
平均值,则获得“销售额”与每个“文章”、“季度”的“销售额”总和的差值,并除以组长度-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循环内部,在