在R中有更好的创建分位数“虚拟变量”/因子的方法吗?

8

我希望能够分配代表分位数的因子。因此,我需要它们是数字。这就是为什么我编写了以下函数,它基本上是我的问题的答案:

qdum <- function(v,q){

qd = quantile(v,1:(q)/q)
v = as.data.frame(v)
v$b = 0
names(v) <- c("a","b")
i=1
for (i in 1:q){

    if(i == 1)
        v$b[ v$a < qd[1]] = 1
    else
        v$b[v$a > qd[i-1] & v$a <= qd[i]] = i
}

all = list(qd,v)
return(all)

    }

现在你可以笑了 :)

返回的列表包含一个变量,可以用于将每个观察值分配到其相应的分位数。我的问题是:是否有更好的方法(更“本地”或“核心”)来做到这一点?我知道 quantcut(来自 gtools 包),但至少对于我得到的参数,我最终只得到了那些不方便的阈值。

欢迎任何有助于改进的反馈!

2个回答

14

使用基本的R语言,通过分位数确定分割点,然后使用cut函数将数值变量转换为离散变量:

qcut <- function(x, n) {
  cut(x, quantile(x, seq(0, 1, length = n + 1)), labels = seq_len(n),
    include.lowest = TRUE)
}

如果您只想要数字:

qcut2 <- function(x, n) {
  findInterval(x, quantile(x, seq(0, 1, length = n + 1)), all.inside = T)
}

看起来 Hadley 正试图提高他的每个被接受答案的击键比率... - Matt Bannert

3

我不确定什么是quantcut,但我会做以下操作

qdum <- function(v, q) {
 library(Hmisc)
 quantilenum <- cut2(v, g=q)
 levels(quantilenum) <- 1:q
 cbind(v, quantilenum)
}

不错的答案。基本上,quantcut与quantcut完全相同。区别在于将levels替换为1:q以进行帮助。我不知道这是可能的。谢谢Sameer! - Matt Bannert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接