2017-09-06 39 views
5

Mam dużą ramkę danych i chcę standaryzować wiele kolumn, jednocześnie warunkując średnią i standardowe odchylenie od wartości. Że mam następujący przykład dane:zmutować kolumny po podzestawie według wartości

set.seed(123) 
df = data.frame("sample" = c(rep(1:2, each = 5)), 
     "status" = c(0,1), 
     "s1" = runif(10, -1, 1), 
     "s2" = runif(10, -5, 5), 
     "s3" = runif(10, -25, 25)) 

i chcą ujednolicić każdy S1-S3 podczas Klimatyzacja średnią i odchylenie standardowe być == stan 0. Jeśli miałbym to zrobić dla powiedzmy, S1 tylko mogłem wykonać następujące czynności:

df = df %>% group_by(sample) %>% 
    mutate(sd_s1 = (s1 - mean(s1[status==0]))/sd(s1[status==0])) 

Ale mój problem pojawia się, gdy muszę wykonać tę operację na wielu kolumnach. Próbowałem napisać funkcję zawierającą z mutate_at:

standardize <- function(x) { 
    return((x - mean(x[status==0]))/sd(x[status==0])) 
} 

df = df %>% group_by(sample) %>% 
    mutate_at(vars(s1:s3), standardize) 

Która po prostu tworzy wartości Na dla s1-s3. Próbowałem użyć odpowiedzi podanej w: R - dplyr - mutate - use dynamic variable names, ale nie mogę dowiedzieć się, jak wykonać podzestaw.

Każda pomoc jest bardzo doceniana. Dzięki!

Odpowiedz

2

Mogliśmy po prostu użyć

df %>% 
    group_by(sample) %>% 
    mutate_at(vars(s1:s3), funs((.- mean(.[status == 0]))/sd(.[status == 0]))) 
+0

Dzięki za ten wielki odpowiedź. Czy istnieje sposób na utworzenie wielu nowych kolumn, takich jak 'sd_s1, sd_s2, ...', zachowując oryginalne kolumny, takie jak 's1, s2, ...' używając funkcji 'mutate_at'? – www

+0

@ycw Dzięki, możesz użyć 'df%>% group_by (sample)%>% mutate_at (vars (s1: s3), funs (sd = (.- mean (. [Status == 0]))/sd (. [status == 0]))) ' – akrun

+0

To jest świetne. Dzięki jeszcze raz. – www