gpt4 book ai didi

r - 作为具有与原始向量相同的顺序/长度的向量,最有效的方法来返回向量在因子水平内的秩?

转载 作者:行者123 更新时间:2023-12-04 22:00:53 24 4
gpt4 key购买 nike

还有一个要求 - 结果向量与原始向量的顺序相同。

我有一个非常基本的函数,可以对向量进行百分位数,并且按照我想要的方式工作:

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 中必须有一些非常直接、优雅的解决方案。有没有?

提前致谢!

最佳答案

ave 函数非常有用。主要的问题是记住你总是需要用 FUN= 命名函数:

 dt <- data.frame(data, f)
dt$rank <- with(dt, ave(data, list(f), FUN=rank))
dt
#---
data f rank
1 1 a 1
2 2 a 2
3 3 b 1
4 100 a 3
5 200 b 2
6 300 b 3

编辑:我以为我在回答标题中的问题,但被要求包含使用“ptile”函数的代码:
> dt$ptile <-  with(dt, ave(data, list(f), FUN=ptile))
> dt
data f rank ptile
1 1 a 1 0.0
2 2 a 2 0.5
3 3 b 1 0.0
4 100 a 3 1.0
5 200 b 2 0.5
6 300 b 3 1.0

关于r - 作为具有与原始向量相同的顺序/长度的向量,最有效的方法来返回向量在因子水平内的秩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4846590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com