在函数内使用dplyr,使用函数参数分组错误

时间:2015-01-27 00:34:43

标签: r function group-by dplyr

下面我有一个关于我想要函数做什么的工作示例,然后是该函数的脚本,注意错误发生的位置。

错误消息是:

Error: index out of bounds

我所知道的通常意味着R无法找到被调用的变量。

有趣的是,在我下面的函数示例中,如果我只按subgroup_name分组(传递给函数并成为新创建的数据框中的列),该函数将成功重新组合该变量,但我也是想要按新创建的列(来自融合)分组调用变量。

类似的代码曾经使用regroup()为我工作,但已被弃用。我试图使用group_by_(),但无济于事。

我已阅读了许多其他帖子和答案,并在今天进行了几个小时的实验,但仍未成功。

# Initialize example dataset
database <- ggplot2::diamonds
database$diamond <- row.names(diamonds) # needed for melting 

subgroup_name <- "cut" # can replace with  "color" or "clarity"
subgroup_column <- 2 # can replace with 3 for color, 4 for clarity

# This works, although it would be preferable not to need separate variables for subgroup_name and subgroup_column number

df <- database %>% 
  select(diamond, subgroup_column, x,y,z) %>% 
  melt(id.vars=c("diamond", subgroup_name)) %>% 
  group_by(cut, variable) %>% 
  summarise(value = round(mean(value, na.rm = TRUE),2))

# This does not work, I am expecting the same output as above

subgroup_analysis <- function(database,...){

  df <- database %>% 
    select(diamond, subgroup_column, x,y,z) %>% 
    melt(id.vars=c("diamond", subgroup_name)) %>% 
    group_by_(subgroup_name, variable) %>% # problem appears to be with finding "variable"
    summarise(value = round(mean(value, na.rm = TRUE),2))
    print(df)
}

subgroup_analysis(database, subgroup_column, subgroup_name)  

1 个答案:

答案 0 :(得分:5)

来自NSE vignette

  

如果您还想输出变量,则需要传递一个列表   引用的对象到.dots参数:

此处,应引用variable

subgroup_analysis <- function(database,...){

  df <- database %>% 
    select(diamond, subgroup_column, x,y,z) %>% 
    melt(id.vars=c("diamond", subgroup_name)) %>% 
    group_by_(subgroup_name, quote(variable)) %>% 
    summarise(value = round(mean(value, na.rm = TRUE),2))
  print(df)
}

subgroup_analysis(database, subgroup_column, subgroup_name) 

正如@RichardScriven所提到的,如果您打算将结果分配给新变量,那么您可能希望最后删除print调用,只需编写df,或者甚至不分配函数中的df

否则,即使您执行x <- subgroup_analysis(...)

,结果也会打印出来