同等百分位数的平均得分表

时间:2015-10-07 21:48:45

标签: r quantile

我是R的新手,所以我对我的解决方案的最佳性感兴趣。即使它有效,也可能(有点)长,我希望你的建议,看看我解决了它的方式"是最好的"它可以帮助我学习R中的新技术和功能。

我有一个关于他们id所识别的学生的数据集,我有他们匹配的学校和他们在特定测试中获得的分数(简而言之:3个变量id,match和score)。 / p>

我需要构建下表:对于两个百分位数的学生,我需要计算他们所匹配学校的学生平均分数(学生之间)的平均分数(因此对于每个学校)我取与之匹配的学生的平均分数,然后计算百分位数的平均值,是这个计算中学校的平均值可能出现两次)。在英语中,它允许我回答:"在分数方面属于x-th百分位数的学生将平均匹配到具有此平均质量的学校"。

以下是图片中的示例:

Example

因此,在这种情况下,如果我将中位数(15)用于分割(而不是百分位数),我想获得:

[0,15]  : 9.5

(15,24] : 20.25

因此,对于得分在0到15之间的学生,我会得到他们匹配的学校平均分数的平均值(请注意,b平均值会出现两次但是没问题。)

我是怎么做到的:

match <- c(a,b,a,b,c)
score <- c(18,4,15,8,24)
scoreQuant <- cut(score,quantile(score,probs=seq(0,1,0.1),na.rm=TRUE))
AvgeSchScore <- tapply(score,match,mean,na.rm=TRUE)
AvgScore <- 0
for(i in 1:length(score)) {
       AvgScore[i] <- AvgeSchScore[match[i]]
}
results <- tapply(AvgScore,scoreQuant,mean,na.rm = TRUE)

如果你有更直接的方式去做..或者我认为坏点是3)使用循环,也许apply()更好?但我不确定如何在这里使用它(我试图编写自己的功能,但它崩溃了所以我和#34;布鲁特强迫它&#34;)。

谢谢:)

1 个答案:

答案 0 :(得分:0)

主要解决方法是使用以下方法消除for循环:

AvgScore <- AvgeSchScore[match]

R允许您以其他语言无法使用的方式进行分组。 tapply函数输出您分组的因子的名称。我们将这些名称用于match到子集AvgeScore

<强> data.table

如果您想尝试data.table,您可能会看到速度提升。

library(data.table)
match <- c("a","b","a","b","c")
score <- c(18,4,15,8,24)
dt <- data.table(id=1:5, match, score)
scoreQuant <- cut(dt$score,quantile(dt$score,probs=seq(0,1,0.1),na.rm=TRUE))
dt[, AvgeScore := mean(score), match][, mean(AvgeScore), scoreQuant]
#    scoreQuant   V1
#1: (17.4,19.2] 16.5
#2:          NA  6.0
#3:   (12.2,15] 16.5
#4:   (7.2,9.4]  6.0
#5:   (21.6,24] 24.0

可能比base R更快。如果NA行中的值困扰您,您可以在之后将其删除。