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!
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
@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
To jest świetne. Dzięki jeszcze raz. – www