为R中的列计算分位数到子集

时间:2014-04-18 11:17:35

标签: r

我有一个具有以下结构的数据集:

Name=c("a","b","c")
Amount_Spent=c(386407,213918,212006)

我要做的是计算每个名称Amount_Spent所属的四分位数,并将值分配给新变量(列)Quantiles。我无法使用任何应用函数来获得此结果,有人可以帮忙吗?

提前致谢, 拉乌尔

2 个答案:

答案 0 :(得分:4)

您可以使用cutquantile执行此操作。

# some data
df <- data.frame(name=letters , am.spent = rnorm(26))

# divide df$am.spent 
df$qnt<- cut(df$am.spent , breaks=quantile(df$am.spent),
                                    labels=1:4, include.lowest=TRUE)

 # check ranges
 tapply(df$am.spent , df$qnt , range)

首先得到quantile      分位数(DF $ am.spent)

#        0%        25%        50%        75%       100% 
#-3.5888426 -0.6879445 -0.1461107  0.5835165  1.2030989 


然后使用cut在指定的切割点划分df $ am.spent - 我们切割分位数的值。这是使用breaks参数

指定的

答案 1 :(得分:1)

你得到的答案取决于你想要削减分位数的精确程度。你想要四分位数(增量为25%),十分位数(增量为10%),百分位数(增量为1%)???

我觉得有一种更简单的方法,但这是一种方法。

df           <- data.frame(Name,Amount_Spent)
q            <- quantile(df$Amount_Spent,prob=seq(0,1,0.01))  # percentiles
# function to retrieve closest quantile for a given value.
get.quantile <- function(x)names(q)[which(abs(q-x)==min(abs(q-x)))]
# apply this function for all values in df$Amount_Spent
df$Quantile  <- sapply(df$Amount_Spent,get.quantile)
df
#   Name Amount_Spent Quantile
# 1    a       386407     100%
# 2    b       213918      50%
# 3    c       212006       0%

这是一个稍微有趣的例子:

set.seed(1)
df <- data.frame(Name=letters,Amount_Spent=runif(26,2e5,4e5))
q <- quantile(df$Amount_Spent,prob=seq(0,1,0.01))
df$Quantile <- sapply(df$Amount_Spent,get.quantile)
head(df)

#   Name Amount_Spent Quantile
# 1    a     253101.7      24%
# 2    b     274424.8      32%
# 3    c     314570.7      52%
# 4    d     381641.6      88%
# 5    e     240336.4      12%
# 6    f     379677.9      84%