【问题标题】:Using dplyr within a function, Grouping Error with function arguments在函数中使用 dplyr,使用函数参数分组错误
【发布时间】:2015-01-27 00:34:43
【问题描述】:

下面我有一个我希望函数执行的工作示例,然后为函数编写脚本,注意错误发生的位置。

错误信息是:

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)  

【问题讨论】:

  • @Richard Scriven - 我想我是,在代码的最后一行调用函数:subgroup_analysis(database, subgroup_column, subgroup_name)。但是,应该/可能直接传递“cut”和 2 而不是代理变量。如果我遗漏了什么,请告诉我,感谢您的关注
  • 是的,很抱歉我没有看到最后的电话。您确定要使用点 ... 而不是命名参数来执行此操作吗?
  • 我很乐意使用命名参数,我也用这种方式进行了实验。阅读有关 group_by_ 的内容会导致对...进行修补,但我对它们没有那么有经验。
  • 不应该是group_by_(subgroup_name, quote(variable))
  • 附带说明,如果您打算将结果分配给一个新变量,那么您可能希望删除最后的 print 调用并只写 df,或者甚至不分配df 在函数中。否则,即使您执行x &lt;- subgroup_analysis(...),结果也会打印出来

标签: r function group-by dplyr


【解决方案1】:

来自 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 at全部在函数中

否则即使您执行x &lt;- subgroup_analysis(...) 也会打印结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2014-11-29
    相关资源
    最近更新 更多