Как сделать функцию категоризации значений переменных с процентилем (квантилем) в R? - PullRequest
1 голос
/ 05 ноября 2019

«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

Перезапустите с Debug

1 Ответ

1 голос
/ 05 ноября 2019

Мы можем использовать cut, чтобы разделить данные на breaks, используя quantile, и использовать 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")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...