2016-08-29 18 views
21

Chciałbym użyć funkcji DFFRR mutate_at do zastosowania funkcji do kilku kolumn w ramce danych, w której funkcja wprowadza kolumnę, do której jest bezpośrednio stosowana, oraz inną kolumnę w ramce danych.Używanie funkcji wielu kolumn w dplyr mutate_at zadzwoń pod numer

Jako konkretny przykład, będę wyglądać mutować następujący dataframe

# Example input dataframe 
df <- data_frame(x = c(TRUE, TRUE, FALSE), 
       y = c("Hello", "Hola", "Ciao"), 
       z = c("World", "ao", "HaOlam") 
       ) 

z mutate_at rozmowy, która wygląda podobnie do tego

df %>% 
mutate_at(.vars = vars(y, z), 
      .funs = ifelse(x, ., NA) 
     ) 

zwrócić dataframe, który wygląda mniej więcej tak

# Desired output dataframe 
df2 <- data_frame(x = c(TRUE, TRUE, FALSE), 
        y_1 = c("Hello", "Hola", NA), 
        z_1 = c("World", "ao", NA) 
       ) 

Pożądany mutate_at wywołanie byłby podobny do następującego zaproszenia do mutate:

df %>% 
    mutate(y_1 = ifelse(x, y, NA), 
      z_1 = ifelse(x, z, NA) 
     ) 

Wiem, że można to zrobić w podstawowej R na kilka sposobów, ale ja specjalnie chciał osiągnąć ten cel za pomocą mutate_at funkcję dplyr dla dobra czytelność, relacje z bazami danych, itp

Poniżej znajdują się podobne pytania zadawane na StackOverflow który nIE adres pytanie postawiłem tutaj:

adding multiple columns in a dplyr mutate call

dplyr::mutate to add multiple values

Use of column inside sum() function using dplyr's mutate() function

+13

'df%>% mutate_at (zmiennych (Y, Z), funs (ifelse (x,. NA))) ' – eipi10

+0

@ eipi10 Ah, ok. Tak więc powyższy kod zadziałałby, gdybym owinął 'ifelse (x,., NA)' w wywołaniu funkcji 'funs()'. Dziękuję Ci! Sprawdziłem twoje rozwiązanie i to działa idealnie. Twoje rozwiązanie jest dokładnie tym, czego szukałem! – bschneidr

Odpowiedz

26

Zostało to odebrane przez @ eipi10 w komentarzu użytkownika @ eipi10 na pytanie, ale piszę go tutaj dla potomności.

Rozwiązaniem tego problemu jest użycie:

df %>% 
    mutate_at(.vars = vars(y, z), 
      .funs = funs(ifelse(x, ., NA))) 

Zastosowanie funs() tutaj wskazuje, że ifelse(x, ., NA) jest funkcja anonimowa, która jest określona w zaproszeniu do mutate_at().

ta działa podobnie do określenia funkcji poza wywołania mutate_at(), tak jak poniżej:

temp_fn <- function(input) ifelse(test = df[["x"]], 
            yes = input, 
            no = NA) 

df %>% 
    mutate_at(.vars = vars(y, z), 
      .funs = temp_fn) 
Powiązane problemy