我有一个具有以下结构的数据集:
Name=c("a","b","c")
Amount_Spent=c(386407,213918,212006)
我要做的是计算每个名称Amount_Spent
所属的四分位数,并将值分配给新变量(列)Quantiles
。我无法使用任何应用函数来获得此结果,有人可以帮忙吗?
提前致谢, 拉乌尔
答案 0 :(得分:4)
您可以使用cut
和quantile
执行此操作。
# 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%