2017-07-03 68 views
7

Próbuję napisać niestandardową funkcję, która obliczy nową zmienną na podstawie wartości z predefiniowanego wektora zmiennych (np. Wektor_heavy), a następnie nazwać nową zmienną na podstawie argumentu dostarczone do funkcji (np. custom_name).Nazywanie nowej zmiennej na podstawie zakrycia

To zmienne nazywanie jest miejscem, w którym moje umiejętności przygniatające mnie zawiodły. Każda pomoc jest bardzo doceniana.

library(tidyverse) 

vector_heavy <- quos(disp, wt, cyl) 

cv_compute <- function(data, cv_name, cv_vector){ 
    cv_name <- enquo(cv_name) 
    data %>% 
    rowwise() %>% 
    mutate(!!cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>% 
    ungroup() 
} 

d <- cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy) 

Mój komunikat brzmi:

Error: unexpected '=' in: 
" rowwise() %>% 
    mutate(!!cv_name =" 

Zdejmowanie !!mutate() przed cv_name w terminie spowoduje funkcji, która oblicza nową zmienną o nazwie cv_name dosłownie, a ignorując custom_name podaję jako argument.

cv_compute <- function(data, cv_name, cv_vector){ 
    cv_name <- enquo(cv_name) 
    data %>% 
    rowwise() %>% 
    mutate(cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>% 
    ungroup() 
} 

Jak mogę uzyskać tę funkcję wykorzystać custom_name I dostarczyć jako argument dla cv_name?

Odpowiedz

7

Musisz użyć pomocnika := w ramach mutate. Będziesz także potrzebował quo_name, aby przekonwertować dane wejściowe na ciąg znaków.

mutate linia swojej funkcji będzie wtedy wyglądać

mutate(!!quo_name(cv_name) := mean(c(!!!cv_vector), na.rm = TRUE))

w całości:

cv_compute <- function(data, cv_name, cv_vector){ 
    cv_name <- enquo(cv_name) 
    data %>% 
      rowwise() %>% 
      mutate(!!quo_name(cv_name) := mean(c(!!!cv_vector), na.rm = TRUE)) %>% 
      ungroup() 
} 

cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy) 

    mpg cyl disp hp drat wt qsec vs am gear carb custom_name 
    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> 
1 21.0  6 160 110 3.90 2.620 16.46  0  1  4  4 56.20667 
2 21.0  6 160 110 3.90 2.875 17.02  0  1  4  4 56.29167 
3 22.8  4 108 93 3.85 2.320 18.61  1  1  4  1 38.10667 
4 21.4  6 258 110 3.08 3.215 19.44  1  0  3  1 89.07167 
5 18.7  8 360 175 3.15 3.440 17.02  0  0  3  2 123.81333 
6 18.1  6 225 105 2.76 3.460 20.22  1  0  3  1 78.15333 
+0

piękne rozwiązanie dziękuję! – Joe