【发布时间】:2011-01-31 00:22:52
【问题描述】:
还有一个要求 - 结果向量与原始向量的顺序相同。
我有一个非常基本的函数,它可以对向量进行百分位计算,并且按照我想要的方式工作:
ptile <- function(x) {
p <- (rank(x) - 1)/(length(which(!is.na(x))) - 1)
p[p > 1] <- NA
p
}
data <- c(1, 2, 3, 100, 200, 300)
例如,ptile(data) 生成:
[1] 0.0 0.2 0.4 0.6 0.8 1.0
我真正想做的是使用相同的功能 (ptile) 并让它在一个因子的级别内工作。所以假设我有一个“因素” f 如下:
f <- as.factor(c("a", "a", "b", "a", "b", "b"))
我希望能够将“数据”转换为一个向量,该向量告诉我,对于每个观察,其对应的百分位数相对于同一级别内的其他观察是多少,如下所示:
0.0 0.5 0.0 1.0 0.5 1.0
作为在黑暗中的镜头,我尝试了:
tapply(data,f,ptile)
并看到它确实成功地进行了排名/百分比,但这样做的方式是我不知道哪些观察结果与其在原始向量中的索引相匹配:
[1] a a b a b b
Levels: a b
> tapply(data,f,ptile)
$a
[1] 0.0 0.5 1.0
$b
[1] 0.0 0.5 1.0
这很重要,因为我正在处理的实际数据可以有 1000-3000 个观察值(股票)和 10-55 个级别(例如行业、按其他股票特征分组等),我需要得到的向量是与它进入的顺序相同,以便在我的矩阵中逐行排列。
是否有一些“应用”变体可以满足我的要求?或者几行可以解决问题的快速行?我已经在 C# 和 F# 中使用更多代码行编写了此功能,但我认为在 R 中必须有一些非常直接、优雅的解决方案。有吗?
提前致谢!
【问题讨论】:
标签: r