如何制作一个函数来用R中的百分位数(分位数)对变量值进行分类



"data"是一个data.frame,有10个数字变量。我想把所有的变量都分类为6个百分点组的变量(5%以下,5%~25%之间,25%~50%之间,50%~75%之间,75%~95%之间,95%以上(我想用一个函数来做它,这样我就可以把所有的变量都分类为一。

我只能在没有以下函数的情况下完成此操作,所以我必须一遍又一遍地重复相同的代码。

m1<- quantile(data$val, 0.05)
m2<- quantile(data$val, 0.25)
m3<- quantile(data$val, 0.5)
m4<- quantile(data$val, 0.75)
m5<- quantile(data$val, 0.95)
data$val[data$val<m1]  = "below0.05"
data$val[data$val>= m1& data$val<m2 ]  = "0.05to0.25"
data$val[data$val>= m2& data$val<m3 ]  = "0.25to0.5"
data$val[data$val>= m3& data$val<m4 ]  = "0.5to0.75"
data$val[data$valT>= m4& data$val<m5 ]  = "0.75to0.95"
data$val[data$val>= m5]  = "upper0.95"
data$val <-as.factor(data$val)

我用lapply((和函数(data,name(尝试了一些代码

fun =function(data, name) {
y <-get(name,data)
m1<- quantile(name,data, 0.05)
m2<- quantile(name,data, 0.25)
m3<- quantile(name,data, 0.5)
m4<- quantile(name,data, 0.75)
m5<- quantile(name,data, 0.95)
RB = rbind(m1, m2, m3, m4, m5)
dimnames(RB)[[2]] = "Value"
name$data[ name$data<m1]  = "below0.05"
name$data[ name$data>= m1& name$data<m2 ]  = "0.05to0.25"
name$data[ name$data>= m2& name$data<m3 ]  = "0.25to0.5"
name$data[ name$data>= m3& name$data<m4 ]  = "0.5to0.75"
name$data[ name$data>= m4& name$data<m5 ]  = "0.75to0.95"
name$data[ name$data>= m5]  = "upper0.95"
name$data <-as.factor(name$data)
}

它只在中途起作用。我想知道如何改正。另外,我想知道如何在这里应用"lapply((",这样我就可以很容易地对所有变量进行分类。请大家帮忙!

Error in `$<-.data.frame`(`*tmp*`, "name", value = character(0)) : 
replacement has 0 rows, data has 301
In addition: Warning messages:
1: Unknown or uninitialised column: 'name'. 
Show Traceback

使用调试重新运行

我们可以使用cut使用quantile将数据划分为breaks,并使用lapply将其应用于多列。所以像这样的东西应该适用于前10列。

lapply(df[1:10], function(x) cut(x, 
breaks = c(-Inf, quantile(x, c(0.05, 0.25, 0.5, 0.75, 0.95))), 
labels = c("below0.05", "0.05to0.25", "0.25to0.5", "0.5to0.75", "0.75to0.95")))

最新更新