grouped_df_impl(data,unname(vars),drop)出错:

时间:2017-12-08 20:33:03

标签: r dplyr

这是我第一次尝试编写一个内部有2个管道的函数,这样当我给出名称x和变量名称y时,结果将被聚合,加入数据并被删除。当我运行我的书面函数时,会出现标题错误消息,我不知道问题是什么。

mrr <- function(x, y){ 
  x <- data %>%
   group_by(y) %>%
   summarize(n=n(),
         sum=sum(unit_sales)) 
data <- data %>%
  left_join(x, by="y") %>%
  mutate(str_c(x,y))=(sum-unit_sales)/(n-1) %>%
  select(-one_of(n, sum)) %>%
  rm(x)
}

当我在搜索框中提供错误消息时,我找到了相关结果,但答案与我的问题无关。如果您有任何想法,请告诉我。

2 个答案:

答案 0 :(得分:2)

这里发生了很多事情。

首先,您不需要在函数中输入x ...因为您会立即覆盖它。我不确定你是否打算输入数据。

接下来,您的group_by无法正常工作,因为您的数据集中不存在y ... y的内容是标题的名称。我们可以使用group_by_()来解决这个问题。

之后,你的mutate命令被破坏了。 mutate(str_c(x,y))是一个完整的mutate语句,因为()已关闭。另外,str_c(x,y)试图获取数据帧x并与y中的字符连接以获得单个字符...这最多会给你一个数据帧,更糟糕的是会出错。最好只指定一个列名。

在同一个mutate中,您可能会在=(sum-unit_sales)/(n-1)中遇到错误。如果n = 1,则得到NaN的除零误差输出。如果你愿意,你可以留下这个。只需了解你的等式实际上在做什么。

接近,-one_of()命令需要一个字符向量(不仅仅是列名。你可以select(-n,-sum)select(-one_of(c("n", "sum")))

最后,您并不需要使用rm(x),因为无论如何,当函数完成运行时,该变量将被删除。

我不得不猜测列的名称......因为你没有给我一个样本数据集,你的名字会有所不同。

data <- data.frame(d1 = runif(n=10,min=1,max=10),
           d2 = runif(n=10,min=1,max=10),
           unit_sales = runif(n=10,min=1,max=10))

mrr <- function(data, y){ 
  x <- data %>%
    group_by_(.dots = y) %>%
    summarize(n=n(),
     sum=sum(unit_sales)) 
  data <- data %>%
  left_join(x, by=y) %>%
    mutate(someCol=(sum-unit_sales)/(n)) %>%
    select(-one_of(c("n", "sum"))) #%>%
    # rm(x)
}

(mrr(data,"d2"))

答案 1 :(得分:0)

你的第二个管道变异的左侧有str_c。 dplyr使用非标准评估,你需要使用一些工具来完成你想要的,vis:=和UQ。有关类似问题,请参阅use dplyr mutate() in programming