管道中的group_by和group_by_

时间:2017-02-07 14:16:24

标签: r group-by dplyr nse

我正在编写一个可以使用dplyr包对变量进行分组和连接的函数:

basket<-function(dataframe, group, target)
{
  dataframe %>% 
    group_by_(group) %>% 
    summarise(new_target=paste(as.character(target), collapse="_"))

}

我正在使用mtcars数据集进行测试:

basket(mtcars, mtcars$am, mtcars$wt)

所需的输出应该是这样的:

am     wt
0      2.62_2.875_2.32...
1      3.215_3.19_3.44...

但是,在我的代码中,group_by_函数无法成功创建基于&#34; am&#34;的组。我得到的结果只是&#34; wt&#34;:

的所有值的连接字符串
[1] "2.62_2.875_2.32_3.215_3.44_3.46_3.57_3.19_3.15_3.44_3.44_4.07_3.73_3.78...

如果我使用group_by,那么我将收到此错误:

stop(structure(list(message = "unknown variable to group by : group", 
call = resolve_vars(new_groups, tbl_vars(.data)), cppstack = structure(list(
    file = "", line = -1L, stack = "C++ stack not available on this system"), .Names = c("file", 
"line", "stack"), class = "Rcpp_stack_trace")), .Names = c("message",  ... 

以前有人见过这个问题吗?

1 个答案:

答案 0 :(得分:1)

您需要group_bysummarise的SE版本,并提供引用的值("")。在引用data.frame中的变量时,请不要将美元符号与dplyr一起使用。

basket<-function(dataframe, group, target) {
  dataframe %>% 
    group_by_(group) %>% 
    summarise_(new_target = lazyeval::interp(~paste(as.character(x), collapse="_"), 
                                             x = as.name(target)))
}

basket(mtcars, "am", "wt")
# A tibble: 2 × 2
     am                                                                                           new_target
  <dbl>                                                                                                <chr>
1     0 3.215_3.44_3.46_3.57_3.19_3.15_3.44_3.44_4.07_3.73_3.78_5.25_5.424_5.345_2.465_3.52_3.435_3.84_3.845
2     1                                 2.62_2.875_2.32_2.2_1.615_1.835_1.935_2.14_1.513_3.17_2.77_3.57_2.78

另见vignette('nse')