R 使用具有do in功能的可变数量的组

R 使用具有do in功能的可变数量的组,r,function,dplyr,tidyverse,R,Function,Dplyr,Tidyverse,我想了解使用tidyverse框架是否以及如何实现这一点 假设我有以下简单的函数: my_fn <- function(list_char) { data.frame(comma_separated = rep(paste0(list_char, collapse = ","),2), second_col = "test", stringsAsFactors = FALSE) } 但是,如果我们使用字符向量更改列表的某些元素,我们可以通过以下

我想了解使用tidyverse框架是否以及如何实现这一点

假设我有以下简单的函数:

my_fn <- function(list_char) {
  data.frame(comma_separated = rep(paste0(list_char, collapse = ","),2), 
         second_col = "test", 
         stringsAsFactors = FALSE)
}
但是,如果我们使用字符向量更改列表的某些元素,我们可以通过以下方式使用
dplyr::do
函数来实现以下功能:

list_char_mult <- list(name = c("Chris", "Mike"),
                       city = c("New York", "London"), language = "R")

expand.grid(list_char_mult, stringsAsFactors = FALSE) %>%
  tbl_df() %>%
  group_by_all() %>% 
  do(my_fn(list(name = .$name, city = .$city, language = "R")))
list\u char\u mult%
tbl_df()%>%
分组依据所有()%>%
do(我的fn(列表(名称=.$name,城市=.$city,language=“R”))
问题是如何编写一个函数来为元素数量可变的列表执行此操作。例如:

my_fn_generic <- function(list_char_mult) {
  expand.grid(list_char_mult, stringsAsFactors = FALSE) %>%
    tbl_df() %>%
    group_by_all() %>% 
    do(my_fn(...))
}
my_fn_generic%
tbl_df()%>%
分组依据所有()%>%
(我的…)
}

谢谢

如果我理解你的问题,你可以使用
应用
而不分组:

expand.grid(list_char_mult, stringsAsFactors = FALSE) %>%
  mutate(comma_separated = apply(., 1, paste, collapse=",")) 

expand.grid(list_char_mult, stringsAsFactors = FALSE) %>%
  mutate(comma_separated = apply(., 1, my_fn)) 

关于如何使用参数数目可变的函数

my_fn_generic <- function(list_char) {
  expand.grid(list_char, stringsAsFactors = FALSE) %>%
    tbl_df() %>%
    group_by_all() %>% 
    do(do.call(my_fn, list(.)))
 }
my_fn_generic(list_char_mult)
# A tibble: 4 x 4
# Groups: name, city, language [4]
#   name  city     language comma_separated 
#  <chr> <chr>    <chr>    <chr>           
#1 Chris London   R        Chris,London,R  
#2 Chris New York R        Chris,New York,R
#3 Mike  London   R        Mike,London,R   
#4 Mike  New York R        Mike,New York,R 

这是一个非常有效的解决方案,但是如果我有一个函数返回一个包含多行的data.frame,它将不起作用。我将编辑我的问题,以确保这是明确的前进。为这一混乱道歉。
expand.grid(list_char_mult, stringsAsFactors = FALSE) %>%
  mutate(comma_separated = apply(., 1, paste, collapse=",")) 

expand.grid(list_char_mult, stringsAsFactors = FALSE) %>%
  mutate(comma_separated = apply(., 1, my_fn)) 
   name     city language  comma_separated
1 Chris   London        R   Chris,London,R
2 Chris New York        R Chris,New York,R
3  Mike   London        R    Mike,London,R
4  Mike New York        R  Mike,New York,R
my_fn_generic <- function(list_char) {
  expand.grid(list_char, stringsAsFactors = FALSE) %>%
    tbl_df() %>%
    group_by_all() %>% 
    do(do.call(my_fn, list(.)))
 }
my_fn_generic(list_char_mult)
# A tibble: 4 x 4
# Groups: name, city, language [4]
#   name  city     language comma_separated 
#  <chr> <chr>    <chr>    <chr>           
#1 Chris London   R        Chris,London,R  
#2 Chris New York R        Chris,New York,R
#3 Mike  London   R        Mike,London,R   
#4 Mike  New York R        Mike,New York,R 
library(tidyverse)
list_char_mult %>%
     expand.grid(., stringsAsFactors = FALSE) %>%
     mutate(comma_separated = purrr::pmap_chr(.l = ., .f = paste, sep=", ") )
#  name     city language     comma_separated
#1 Chris New York        R Chris, New York, R
#2  Mike New York        R  Mike, New York, R
#3 Chris   London        R   Chris, London, R
#4  Mike   London        R    Mike, London, R