2011-10-31 4 views
3

Извинения это что-то более опытный пользователь R, который знал бы, но я просто наткнулся на это и хотел спросить о правильном использовании.Использование as.factor вместо plyr и ddply для группировки переменных в R?

Кажется, что можно классифицировать диапазоны для переменных с помощью as.factor. Таким образом, я мог группировать наблюдения в диапазон. Например, если я смотрю на посещения пользователя, похоже, что я мог бы написать оператор if/then, чтобы выучить пользователей по количеству посещений, которые у них были, а затем получить сводную статистику на основе группы.

Вот ссылка, где я узнал об этом: http://programming-r-pro-bro.blogspot.com/2011/10/modelling-with-r-part-2.html

Теперь, в то время как эта функция выглядит проще, чем группировка данных с помощью plyr и ddply, он не выглядит достаточно мощным, чтобы разбить переменную в число X из бункеров (например, 10 для дециля). Вы должны были бы сделать это сами.

Это приводит к моему вопросу. Является ли лучше, чем другой для группировки данных, или существует только множество способов борьбы с подобными группировками?

Благодаря

+2

'as.factor' просто преобразует вектор символа в фактор - он сам не анализирует. 'ddply' является одним из мощных инструментов в пакете, предоставляемом' plyr'. Сравнение 'as.factor' с' ddply' немного напоминает сравнение шарикового подшипника с коробкой передач. – Andrie

+2

Возможно, вы захотите взглянуть на '? Cut'. Вы также можете взглянуть на http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example. С небольшим примером того, что вы хотите сделать, люди будут больше легко перезвоните и покажите вам несколько более простых способов сделать это. 'cut()' является одним из них. –

+1

Извините @ Joris, я действительно должен позволить людям улучшить свой вопрос, прежде чем отвечать. – Aaron

ответ

8

cut Я думаю, что это лучший инструмент для этого.

С некоторой выборки данных:

set.seed(123) 
age <- round(runif(10,20,50)) 

Это то, что я хотел бы сделать:

> cut(age, c(0,30,40,Inf)) 
[1] (0,30] (40,Inf] (30,40] (40,Inf] (40,Inf] (0,30] (30,40] (40,Inf] 
[9] (30,40] (30,40] 
Levels: (0,30] (30,40] (40,Inf] 

Необязательно, устанавливая фактор метки вручную:

> cut(age, c(0,30,40,Inf), labels=c('0-30', '31-40', '40+')) 
[1] 0-30 40+ 31-40 40+ 40+ 0-30 31-40 40+ 31-40 31-40 
Levels: 0-30 31-40 40+ 

В отличие от этого, связанная страница предлагает следующее:

> as.factor(ifelse(age<=30, '0-30', ifelse(age <= 40, '30-40', '40+'))) 
[1] 0-30 40+ 30-40 40+ 40+ 0-30 30-40 40+ 30-40 30-40 
Levels: 0-30 30-40 40+ 
+1

«cut» определенно лучше, чем этот подход ifelse, показанный на связанной странице. Обратите внимание на include.lowest аргумент «cut». –

+0

Спасибо за предложения. Я понимаю, почему это, вероятно, лучший способ приблизиться к нему. – mikebmassey

 Смежные вопросы

  • Нет связанных вопросов^_^