Усредните неизвестное количество ответов на респондента; р
Сценарий: у меня есть df, "оценки" нескольких попыток пользователей при прохождении теста. Каждое наблюдение - это попытка с идентификатором пользователя и оценкой. Некоторые пользователи могут передать свою первую попытку, некоторые могут занять несколько; они получают неограниченные попытки. Я хочу найти средний балл для каждого пользователя.
Например:
userID = c(1:20, sample(1:20, 10, replace = TRUE))
score = c(rnorm(15, mean = 60, sd = 10), rnorm(8, mean = 70, sd = 5),
rnorm(7, mean = 90, sd = 2))
scores = data.frame(userID, score)
Мне нужен фрейм данных конечного результата, который представляет собой просто список уникальных идентификаторов пользователей со средним значением всех их попыток (независимо от того, пытались ли они один или несколько раз).
Из всех глупых подходов, которые я пробовал, мой самый последний был:
avgScores = aggregate(scores, by=list("userID"), "mean")
и получил следующее сообщение об ошибке: "аргументы должны иметь одинаковую длину". Я также пробовал сортировать и поднаправлять (фактический фрейм данных имеет метки времени) и шевелить носом и стучать по ботинкам вместе, но я не пойду куда, и этот мозг новичка сгорел.
БЛАГОДАРЮ ВАС
3 ответа
Лучше (более элегантно) здесь использовать aggregate
с формулой формы:
aggregate(score~userID,scores,mean)
Или используя классическую форму, как вы пытались, но вы получите немного другой результат:
aggregate(scores,by=list(userID),mean) ## using name and not string
Конечно, если у вас большой data.frame, лучше использовать одно из решений, предложенных в других ответах.
#data.table
library(data.table)
DT<-data.table(scores)
DT[,.(mean_score=mean(score)),by=userID]
#dplyr
library(dplyr)
scores %>%
group_by(userID)%>%
summarise(mean_score=mean(score))
Ты можешь сделать:
library(dplyr)
scores %>% group_by(userID) %>% summarise(mean = mean(score))