如何创建四分位列?

时间:2011-09-22 00:26:04

标签: r

我在R中有一个名为tableOne的表:

idNum        binaryVariable        salePrice
2               1                    55.56
4               0                    88.33
15              0                     4.45
87              1                    35.77
...            ...                    ...

我想使用:summary(tableOne $ salePrice)生成的值,通过salePrice创建四个四分位数。然后,我想创建一个列tableOne $ quartile,每行sortPrice所在的四分位数。它看起来像:

idNum        binaryVariable            salePrice      quartile
    2               1                    55.56            3
    4               0                    88.33            4
    15              0                     4.45            1
    87              1                    35.77            2 
    ...            ...                    ...            ...  

有什么建议吗?

7 个答案:

答案 0 :(得分:49)

这应该这样做:

tableOne <- within(tableOne, quartile <- as.integer(cut(salesPrice, quantile(salesPrice, probs=0:4/4), include.lowest=TRUE)))

......一些细节:

within函数非常适合计算新列。您不必将列引用为 tableOne$salesPrice等。

tableOne <- within(tableOne, quartile <- <<<some expression>>>)

quantile函数计算分位数(或者在您的情况下,四分位数)。 0:4/4评估为c(0, 0.25, 0.50, 0.75, 1)

最后,cut函数将您的数据拆分为这些四分位数。但是,您会得到一个名字很奇怪的factor,因此as.integer会将其转换为群组1,2,3,4

尝试?within等,详细了解此处提及的功能......

答案 1 :(得分:7)

data.table方法

    library(data.table)
    tableOne <- setDT(tableOne)[, quartile := cut(salesPrice, quantile(salesPrice, probs=0:4/4), include.lowest=TRUE, labels=FALSE)]

答案 2 :(得分:3)

labels=FALSE中设置参数cut()会将类别名称作为整数返回。见?cut

tableOne <- within(tableOne, quartile <- cut(salesPrice, quantile(salesPrice, probs=0:4/4), include.lowest=TRUE, labels=FALSE))

答案 3 :(得分:0)

您可以使用以下脚本

tableOne$Quartile<-ifelse(tableOne$salesPrice<=quantile(tableOne$salesPrice,c(0.25)),1,
                           ifelse(tableOne$salesPrice<=quantile(tableOne$salesPrice,c(0.5)),2,
                                  ifelse(tableOne$salesPrice<=quantile(tableOne$salesPrice,c(0.75)),3,
                                         ifelse(tableOne$salesPrice<=quantile(tableOne$salesPrice,c(1)),4,NA))))

答案 4 :(得分:0)

使用软件包cutr,我们可以做到:

for(int i=0; i<5; i++) {
            String buttonID = "guia" + i;
            int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
            buttons[i] = ((Button) findViewById(resID));
            buttons[i].setVisibility(View.GONE);
}

答案 5 :(得分:0)

使用dplyr,您可以使用ntile函数:

ntile(x, n)


tableOne$quartile <- ntile(tableOne$salesPrice, 4)

这将在表中添加一列,为基于行的价格分位数向每行分配一个基于n的分位数。

注意:此方法从较低的值1开始,然后从那里开始向上。

答案 6 :(得分:0)

以下代码创建一个ntile组向量:

qgroup = function(numvec, n = 4){

    qtile = quantile(numvec, probs = seq(0, 1, 1/n))
    out = sapply(numvec, function(x) sum(x >= qtile[-(n+1)]))

    return(out)
}