每个受访者的平均回答数量未知;R

每个受访者的平均回答数量未知;R,r,split,aggregate,R,Split,Aggregate,场景:我有一个df,多个用户试图通过测试的“分数”。每次观察都是使用userID和score进行的尝试。有些用户可能会放弃第一次尝试,有些用户可能会尝试几次;他们得到无限的尝试。我想找到每个用户的平均分数 例如: 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, s

场景:我有一个df,多个用户试图通过测试的“分数”。每次观察都是使用userID和score进行的尝试。有些用户可能会放弃第一次尝试,有些用户可能会尝试几次;他们得到无限的尝试。我想找到每个用户的平均分数

例如:

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)
我需要一个最终结果数据框,它只是一个唯一用户ID列表,其中包含所有尝试的平均值(无论尝试一次还是多次)

在我尝试过的所有愚蠢的方法中,我最近的一个是:

avgScores = aggregate(scores, by=list("userID"), "mean")
并收到以下错误消息:“参数必须具有相同的长度。” 我也尝试过分类和细分(实际的数据帧有时间戳),扭动我的鼻子,敲打我的鞋子,但我没有办法,这个noob大脑被炸了

谢谢

#data.table
#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))
库(数据表) DT% 分组人(用户ID)%>% 总结(平均分=平均分)
您可以执行以下操作:

library(dplyr)
scores %>% group_by(userID) %>% summarise(mean = mean(score))
这里更好(更优雅)地使用
聚合
和公式形式:

aggregate(score~userID,scores,mean)
或者使用您尝试过的经典形式,但得到的结果略有不同:

aggregate(scores,by=list(userID),mean) ## using name and not string

当然,如果你有big data.frame,最好使用其他答案中建议的一种解决方案。

同样有效,我欣赏不同的方法。谢谢从未考虑过data.table方法,因此我将不得不使用该方法以及dplyr。谢谢你的帮助!