Квантильные результаты для всего фрейма данных

У меня есть довольно большой набор данных, состоящий примерно из 100 переменных и около 1 миллиона наблюдений. Набор данных содержит как числовые, так и категориальные переменные. Я хочу вычислить квантиль для всех числовых переменных, поэтому, когда я пытаюсь сделать следующее: quantile(dat1, c(.10, .30, .5, .75, .9, na.rm = TRUE)

Я получаю сообщение об ошибке в R, говорящее «нечисловой аргумент для бинарного оператора».

Так может ли кто-нибудь предложить мне соответствующие коды для этого? Ценю всю вашу помощь и спасибо


person Rookie    schedule 30.03.2017    source источник
comment
Какой у тебя dat1? Укажите некоторые данные.   -  person Aleksandr    schedule 30.03.2017
comment
dat1 - это имя моего набора данных   -  person Rookie    schedule 30.03.2017
comment
Если я продолжу вычислять квантиль для каждой числовой переменной в моем наборе данных dat1, это займет много времени, поэтому я хочу вычислить квантиль для всех числовых переменных за один раз.   -  person Rookie    schedule 30.03.2017
comment
@Sathish Я попробовал ваш код, но он дает мне объединенные значения всех числовых столбцов. Мне нужны квантильные результаты для всех строк, принадлежащих каждому числовому столбцу отдельно. Например, если a и b — мои числовые столбцы, то мне нужны квантильные результаты для a и b отдельно. Спасибо   -  person Rookie    schedule 30.03.2017
comment
@Rookie Скобки в вашем коде неправильные.   -  person takje    schedule 30.03.2017


Ответы (1)


Квантиль всех числовых столбцов

# sample data with numeric and character class values 
df <- data.frame(a = 1:5, b= 1:5, c = letters[1:5])
col_numeric <- which( sapply(df, is.numeric ) )   # get numeric column indices
quantile( x = unlist( df[,  col_numeric] ), 
          c(.10, .30, .5, .75, .9),
          na.rm = TRUE )

# 10% 30% 50% 75% 90% 
#  1   2   3   4   5 

Квантиль отдельного числового столбца

sapply( col_numeric, function( y ) {
  quantile( x = unlist( df[,  y ] ), 
            c(.10, .30, .5, .75, .9),
            na.rm = TRUE )
})

#       a   b
# 10% 1.4 1.4
# 30% 2.2 2.2
# 50% 3.0 3.0
# 75% 4.0 4.0
# 90% 4.6 4.6

Поскольку ваши реальные данные велики, вы можете использовать библиотеку data.table для повышения эффективности.

library('data.table')
setDT(df)[, lapply( .SD, quantile, probs = c(.10, .30, .5, .75, .9), na.rm = TRUE ), .SDcols = col_numeric ]
person Sathish    schedule 30.03.2017
comment
Спасибо, Сатиш, у меня отлично работает второй фрагмент кода. - person Rookie; 30.03.2017
comment
Есть ли способ сохранить результаты для второго фрагмента кода в виде фрейма данных, где 10%, 30%, 50%, 75% и 90% размещены в столбцах, а числовые переменные a и b размещены как ряды. Еще раз спасибо. - person Rookie; 30.03.2017
comment
транспонируйте свои результаты, выполнив data.frame( t( results ) ) - person Sathish; 30.03.2017