2017-12-27 119 views
5

Tôi muốn hiểu cách thức và cách thức này có thể đạt được bằng cách sử dụng khung gọn gàng.Sử dụng số lượng nhóm thay đổi với chức năng

Giả sử tôi có chức năng đơn giản như sau:

my_fn <- function(list_char) { 
    data.frame(comma_separated = rep(paste0(list_char, collapse = ","),2), 
     second_col = "test", 
     stringsAsFactors = FALSE) 
} 

Với danh sách dưới đây:

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

chức năng của tôi hoạt động tốt nếu bạn chạy:

my_fn(list_char) 

Tuy nhiên, nếu chúng ta thay đổi một số phần tử của danh sách có vectơ ký tự chúng ta có thể sử dụng hàm dplyr::do theo cách sau đây để đạt được những điều sau:

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"))) 

Câu hỏi là cách viết một hàm có thể thực hiện điều này cho một danh sách có nhiều yếu tố khác nhau. Ví dụ:

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

Cảm ơn

Trả lời

1

Về làm thế nào để sử dụng chức năng với biến số đối số

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 

Hoặc sử dụng 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

Nếu tôi hiểu câu hỏi của bạn, bạn có thể sử dụng apply mà không nhóm:

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

Đây là một giải pháp hoàn toàn hợp lệ, tuy nhiên nó sẽ không hoạt động nếu tôi đã có một hàm trả về một data.frame với nhiều hơn một dòng. Tôi sẽ chỉnh sửa câu hỏi của mình để đảm bảo câu hỏi này rõ ràng về sau. Xin lỗi vì sự nhầm lẫn. – Christos

Các vấn đề liên quan