Я хочу создать функцию для приема фрейма данных и строки, назначенной GENDER. Функция найдет среднее значение и стандартное отклонение каждой переменной в df по GENDER и вернет фрейм данных со всей этой информацией в новый df с именем «GENDERstats», который я мог бы использовать в дальнейшем для дальнейшего анализа.
Я могу получить все, что хочу, пока не назову новую «GENDERstats» df, тогда она выдает ошибку
Вот что у меня есть до сих пор, с фиктивными данными
df <- data.frame(GENDER=c("M","F","M","F","M","F"),HELP=c(5,4,2,7,5,5),CARE=c(6,4,7,8,5,4),TRUST=c(6,5,3,6,8,6),SERVE=c(6,5,7,8,7,6))
my.func <- function(dat, bias){
datFrame <- data.frame()
for(i in 2:5){
d1 <- aggregate(dat[,i],by=list(dat[,bias]),FUN=mean,na.rm=TRUE)
d2 <- aggregate(dat[,i],by=list(dat[,bias]),FUN=sd,na.rm=TRUE)
d1$sd <- d2$x
d1$Var <- i
datFrame <- rbind(datFrame,d1)
}
# paste(bias,"stats") <- datFrame
}
Я получаю нужный df в «datFrame», но я хочу вставить переменную смещения и «статистику», чтобы создать новый фрейм данных. Я буду делать это с несколькими разными «предубеждениями».
Я хочу, чтобы новый df выглядел так:
Group.1 x sd Var
1 F 5.333333 1.5275252 2
2 M 4.000000 1.7320508 2
3 F 5.333333 2.3094011 3
4 M 6.000000 1.0000000 3
5 F 5.666667 0.5773503 4
6 M 5.666667 2.5166115 4
7 F 6.333333 1.5275252 5
8 M 6.666667 0.5773503 5
а оттуда я могу строить графики или ориентироваться только на средства или sds
Для агрегата вам также не нужны циклы
Если вы ищете длинный формат, используйте gatherdf %>% group_by(GENDER) %>% summarise_all(list(~ mean(.), ~sd(.))) %>% gather(key, val, -GENDER)
Что такое bias? Можете ли вы привести пример?





Я не совсем уверен, как исправить вашу функцию (отсутствует пара деталей), но вы можете получить те же результаты без пользовательской функции или цикла for. Следующее перебирает комбинации GENDER + другие переменные, генерирует средние и SD с aggregate, а затем rbinds кадры данных в do.call:
do.call("rbind", lapply(2:ncol(df),
function(j) {
df_out <- aggregate(df[j], list(df$GENDER), "mean")
df_out[3] <-
aggregate(df[j], list(df$GENDER), "sd")[[2]]
df_out[4] <- j
`names<-`(df_out, c("gender", "x", "sd", "var"))
}))
#### OUTPUT ####
gender x sd var
1 F 5.33333 1.52753 2
2 M 4.00000 1.73205 2
3 F 5.33333 2.30940 3
4 M 6.00000 1.00000 3
5 F 5.66667 0.57735 4
6 M 5.66667 2.51661 4
7 F 6.33333 1.52753 5
8 M 6.66667 0.57735 5
Я не уверен, что в базе R нет более удобного способа сделать это. Лично я бы выбрал gather + group_by + summarise от dplyr, что намного чище и проще для понимания. Вывод почти такой же, как и выше, только в другом порядке. Округление выглядит иначе только из-за того, как печатаются таблички:
library(dplyr)
library(tidyr)
df %>%
gather(var, val, -GENDER) %>%
group_by(GENDER, var) %>%
summarise(x = mean(val), sd = sd(val))
#### OUTPUT ####
# A tibble: 8 x 4
# Groups: GENDER [2]
GENDER var x sd
<chr> <chr> <dbl> <dbl>
1 F CARE 5.33 2.31
2 F HELP 5.33 1.53
3 F SERVE 6.33 1.53
4 F TRUST 5.67 0.577
5 M CARE 6 1
6 M HELP 4 1.73
7 M SERVE 6.67 0.577
8 M TRUST 5.67 2.52
Попробуйте
df %>% group_by(GENDER) %>% summarise_all(list(~ mean(.), ~sd(.)))