2017-08-29 35 views
6

Rozważmy prosty przykład:Tworzenie nowych zmiennych z mutate_at zachowując oryginalne

library(dplyr) 

dataframe <- data_frame(helloo = c(1,2,3,4,5,6), 
         ooooHH = c(1,1,1,2,2,2), 
         ahaaa = c(200,400,120,300,100,100)) 

# A tibble: 6 x 3 
    helloo ooooHH ahaaa 
    <dbl> <dbl> <dbl> 
1  1  1 200 
2  2  1 400 
3  3  1 120 
4  4  2 300 
5  5  2 100 
6  6  2 100 

Tutaj chcę zastosować funkcję ntile wszystkich kolumn, które zawiera oo, ale chciałbym te nowe kolumny, aby być o nazwie cat + odpowiednia kolumna.

wiem, że mogę to zrobić

dataframe %>% mutate_at(vars(contains('oo')), .funs = funs(ntile(., 2))) 
# A tibble: 6 x 3 
    helloo ooooHH ahaaa 
    <int> <int> <dbl> 
1  1  1 200 
2  1  1 400 
3  1  1 120 
4  2  2 300 
5  2  2 100 
6  2  2 100 

Ale to, co potrzebne jest to

# A tibble: 8 x 5 
    helloo ooooHH ahaaa cat_helloo cat_ooooHH 
    <dbl> <dbl> <dbl> <int> <int> 
1  1  1 200  1  1 
2  2  1 400  1  1 
3  3  1 120  1  1 
4  4  2 300  2  2 
5  5  2 100  2  2 
6  5  2 100  2  2 
7  6  2 100  2  2 
8  6  2 100  2  2 

Czy istnieje rozwiązanie, które nie wymaga przechowywania danych pośrednich, i scalić z powrotem do oryginału ramka danych?

Odpowiedz

13

Możesz nadać nazwy funkcjom w funs, aby utworzyć nowe zmienne z nazwami jako dołączonymi sufiksami.

dataframe %>% mutate_at(vars(contains('oo')), .funs = funs(cat = ntile(., 2))) 

# A tibble: 6 x 5 
    helloo ooooHH ahaaa helloo_cat ooooHH_cat 
    <dbl> <dbl> <dbl>  <int>  <int> 
1  1  1 200   1   1 
2  2  1 400   1   1 
3  3  1 120   1   1 
4  4  2 300   2   2 
5  5  2 100   2   2 
6  6  2 100   2   2 

Jeśli chcesz go jako prefiks zamiast, można następnie wykorzystać rename_at zmienić nazwy.

dataframe %>% 
    mutate_at(vars(contains('oo')), .funs = funs(cat = ntile(., 2))) %>% 
    rename_at(vars(contains("_cat")), funs(paste("cat", gsub("_cat", "", .), sep = "_"))) 

# A tibble: 6 x 5 
    helloo ooooHH ahaaa cat_helloo cat_ooooHH 
    <dbl> <dbl> <dbl>  <int>  <int> 
1  1  1 200   1   1 
2  2  1 400   1   1 
3  3  1 120   1   1 
4  4  2 300   2   2 
5  5  2 100   2   2 
6  6  2 100   2   2 
+1

Domyślam się, że zawsze można napisać coś w stylu regex, aby zmienić nazwę zmiennych 'col_cat'? –

+0

@ ℕʘʘḆḽḘ Tak. Prawdopodobnie w "rename_at" dla wygody; dodany przykład w edycji. – aosmith

+0

Zmiana nazwy pojawia się tylko do uzupełnienia, jeśli istnieje więcej niż jedna kolumna zawierająca dopasowanie. Czy istnieje sposób na dodanie go do pojedynczego meczu? Przykład: 'dataframe%>% mutate_at (vars (zawiera ('ah')), .funs = funs (cat = ntile (., 2)))' – bheavner