2017-02-07 14 views
0

Я пишу функцию, которая может группировать и конкатенации переменных с использованием пакета dplyr:group_by и group_by_ в трубах

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_ не удалась полностью создавать группы на основе «am». В результате я получаю просто каскадный строка всех значений «вес»:

[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", ... 

ли кто-нибудь видел эту проблему раньше?

+0

Можете ли вы рассказать о ожидаемом выходе? – Axeman

+0

Спасибо за напоминание! См. Обновленный – user95902

ответ

0

Вам понадобятся версии SE как group_by, так и summarise, и укажите значения, указанные (""). Не используйте нотацию в долларах с dplyr при обращении к переменным в data.frame под рукой.

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').

+0

Спасибо Axeman! Я догадался, что group_by_ не может распознать переменную как имя, но я не знал, как ее исправить. Это делает правильную работу! – user95902