Использование as.factor вместо plyr и ddply для группировки переменных в R? - PullRequest
3 голосов
/ 31 октября 2011

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

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

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

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

Это приводит к моему вопросу - лучше ли другой группировать данные, или есть только много способов справиться с группировкой, подобной этой?

Спасибо

1 Ответ

8 голосов
/ 31 октября 2011

Я думаю, 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+
...