यहाँ डेटा है:

library(tidyverse)

data <- tibble::tribble(
  ~var1, ~var2, ~var3,  ~var4,    ~var5,
    "a",   "d",   "g",  "hello",    1L,
    "a",   "d",   "h",  "hello",    2L,
    "b",   "e",   "h",  "k",        4L,
    "b",   "e",   "h",  "k",        7L,
    "c",   "f",   "i",  "hello",    3L,
    "c",   "f",   "i",  "hello",    4L
  )

और वैक्टर, मैं उपयोग करना चाहता हूँ:

filter_var <- c("hello")
groupby_vars1 <- c("var1", "var2", "var3")
groupby_vars2 <- c("var1", "var2")
joinby_vars1 <- c("var1", "var2")
joinby_vars2 <- c("var1", "var2", "var3")

दूसरे और पांचवें, और तीसरे और चौथे वैक्टर समान हैं, लेकिन कृपया मान लें कि वे अलग हैं और उन्हें अलग-अलग वैक्टर के रूप में बनाए रखें।

अब मैं एक सामान्य कार्य बनाना चाहता हूं जहां मैं परिणाम प्राप्त करने के लिए डेटा और इन वैक्टरों को ले सकता हूं।

my_fun <- function(data, filter_var, groupby_vars1,groupby_vars2, joinby_vars1, joinby_vars2) {

  data2 <- data %>% filter(var4 == filter_var) 

  data3 <- data2 %>%
    group_by(groupby_vars1) %>% 
    summarise(var6 = sum(var5))

  data4 <- data3 %>%
    ungroup() %>%
    group_by(groupby_vars2) %>% 
    summarise(avg = mean(var6,na.rm = T))

  data5 <- data3 %>% left_join(data4, by = joinby_vars1)

  data6 <- data %>% left_join(data5, by = joinby_vars2)
}

समस्या शरीर में dplyr तर्कों के रूप में उपयोग किए जाने वाले फ़ंक्शन में एकाधिक चर के एकाधिक वैक्टरों की आपूर्ति करने की है। मैंने http://dplyr.tidyverse.org/articles/programming.html, लेकिन उपरोक्त समस्या का समाधान नहीं कर सका।

6
Geet 25 अप्रैल 2018, 02:24

1 उत्तर

सबसे बढ़िया उत्तर

group_by इनपुट के रूप में groupby_vars... स्ट्रिंग्स नहीं ले सकते। आपको स्ट्रिंग वेक्टर को वेरिएबल में बदलने के लिए rlang::syms() का उपयोग करने की आवश्यकता है, फिर !!! का उपयोग उन्हें अनकोट करने के लिए करें ताकि उनका मूल्यांकन group_by के अंदर किया जा सके।

library(tidyverse)
library(rlang)

data <- tibble::tribble(
  ~var1, ~var2, ~var3,  ~var4,    ~var5,
  "a",   "d",   "g",  "hello",    1L,
  "a",   "d",   "h",  "hello",    2L,
  "b",   "e",   "h",  "k",        4L,
  "b",   "e",   "h",  "k",        7L,
  "c",   "f",   "i",  "hello",    3L,
  "c",   "f",   "i",  "hello",    4L
)

filter_var <- c("hello")
groupby_vars1 <- c("var1", "var2", "var3")
groupby_vars2 <- c("var1", "var2")
joinby_vars1  <- c("var1", "var2")
joinby_vars2  <- c("var1", "var2", "var3")

my_fun <- function(data, filter_var, 
                   groupby_vars1, groupby_vars2, 
                   joinby_vars1,  joinby_vars2) {

  groupby_vars1 <- syms(groupby_vars1)
  groupby_vars2 <- syms(groupby_vars2)

  data2 <- data %>% 
    filter(var4 == filter_var) 

  data3 <- data2 %>%
    group_by(!!! groupby_vars1) %>% 
    summarise(var6 = sum(var5))

  data4 <- data3 %>%
    ungroup() %>%
    group_by(!!! groupby_vars2) %>% 
    summarise(avg = mean(var6, na.rm = TRUE))

  data5 <- data3 %>% 
    left_join(data4, by = joinby_vars1)

  data6 <- data %>% 
    left_join(data5, by = joinby_vars2)

  return(data6)
}

my_fun(data, filter_var, 
       groupby_vars1, groupby_vars2, 
       joinby_vars1,  joinby_vars2)

#> # A tibble: 6 x 7
#>   var1  var2  var3  var4   var5  var6   avg
#>   <chr> <chr> <chr> <chr> <int> <int> <dbl>
#> 1 a     d     g     hello     1     1   1.5
#> 2 a     d     h     hello     2     2   1.5
#> 3 b     e     h     k         4    NA  NA  
#> 4 b     e     h     k         7    NA  NA  
#> 5 c     f     i     hello     3     7   7  
#> 6 c     f     i     hello     4     7   7

इसे करने का दूसरा तरीका: स्ट्रिंग वेक्टर को बाहर parse_exprs का उपयोग करके पार्स करें और फिर उन्हें फ़ंक्शन के अंदर अनकोट करें। यह भी देखें यह

my_fun2 <- function(data, filter_var, 
                   groupby_vars1, groupby_vars2, 
                   joinby_vars1,  joinby_vars2) {

  data2 <- data %>% 
    filter(var4 == filter_var) 

  data3 <- data2 %>%
    group_by(!!! groupby_vars1) %>% 
    summarise(var6 = sum(var5))

  data4 <- data3 %>%
    ungroup() %>%
    group_by(!!! groupby_vars2) %>% 
    summarise(avg = mean(var6, na.rm = TRUE))

  data5 <- data3 %>% 
    left_join(data4, by = joinby_vars1)

  data6 <- data %>% 
    left_join(data5, by = joinby_vars2)

  return(data6)
}

my_fun2(data, filter_var, 
        parse_exprs(groupby_vars1), parse_exprs(groupby_vars2), 
        joinby_vars1,  joinby_vars2) 

identical(my_fun(data, filter_var, 
                 groupby_vars1, groupby_vars2, 
                 joinby_vars1,  joinby_vars2),
          my_fun2(data, filter_var, 
                  parse_exprs(groupby_vars1), parse_exprs(groupby_vars2), 
                  joinby_vars1,  joinby_vars2))

[1] TRUE                      

2018-04-24 को reprex पैकेज (v0.2.0) द्वारा बनाया गया।

7
Tung 29 सितंबर 2018, 01:27