2017-12-27 6 views
5

これは、tidyverseフレームワークを使用してこれを達成できるかどうか、またどのように達成できるかを理解したいと思います。doを持つ可変数のグループを使用する

以下のリストを考えると
my_fn <- function(list_char) { 
    data.frame(comma_separated = rep(paste0(list_char, collapse = ","),2), 
     second_col = "test", 
     stringsAsFactors = FALSE) 
} 

:しかし、我々は変更する場合

my_fn(list_char) 

list_char <- list(name = "Chris", city = "London", language = "R") 

あなたが実行した場合、私の機能が正常に動作し

は、私は、次の簡単な関数を持っていると仮定します文字のベクトルを持つリストの要素のいくつかは、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"))) 

質問は、要素の数が可変でリストについては、これを行うことが機能を記述する方法です。例えば:私はあなたの質問を理解していれば

my_fn_generic <- function(list_char_mult) { 
    expand.grid(list_char_mult, stringsAsFactors = FALSE) %>% 
    tbl_df() %>% 
    group_by_all() %>% 
    do(my_fn(...)) 
} 

おかげ

答えて

1

は、変数と関数を使用する方法について引数の数

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を返す関数を持っている場合しかし、それは動作しないだろう、これは完全に有効なソリューションですpmap

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 
1

、あなたはグループ化せずにapplyを使用することができます。

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 
+0

を使用しています。私は質問を編集して、これが確実に進むことを確認します。混乱の謝罪 – Christos

関連する問題