У меня есть кадр данных, который содержит историю событий, и я хочу проверить его целостность, проверив, соответствует ли последнее событие для каждого идентификационного номера текущему значению в системе для этого идентификационного номера. Данные кодируются как факторы. Следующий кадр игрушка данных минимальный пример:Обработка переменных факторов в dplyr
df <-data.frame(ID=c(1,1,1,1,2,2,2,3,3),
current.grade=as.factor(c("Senior","Senior","Senior","Senior",
"Junior","Junior","Junior",
"Sophomore","Sophomore")),
grade.history=as.factor(c("Freshman","Sophomore","Junior","Senior",
"Freshman","Sophomore","Junior",
"Freshman","Sophomore")))
, который дает OUTPUT
> df
ID current.grade grade.history
1 1 Senior Freshman
2 1 Senior Sophomore
3 1 Senior Junior
4 1 Senior Senior
5 2 Junior Freshman
6 2 Junior Sophomore
7 2 Junior Junior
8 3 Sophomore Freshman
9 3 Sophomore Sophomore
> str(df)
'data.frame': 9 obs. of 3 variables:
$ ID : num 1 1 1 1 2 2 2 3 3
$ current.grade: Factor w/ 3 levels "Junior","Senior",..: 2 2 2 2 1 1 1 3 3
$ grade.history: Factor w/ 4 levels "Freshman","Junior",..: 1 4 2 3 1 4 2 1 4
Я хочу использовать dplyr
для извлечения последнего значения в grade.history
и проверить его на current.grade
:
df.summary <- df %>%
group_by(ID) %>%
summarize(current.grade.last=last(current.grade),
grade.history.last=last(grade.history))
Однако dplyr
, кажется, преобразует факторы в целые числа, поэтому я получаю это:
> df.summary
Source: local data frame [3 x 3]
ID current.grade.last grade.history.last
1 1 2 3
2 2 1 2
3 3 3 4
> str(df.summary)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 3 obs. of 3 variables:
$ ID : num 1 2 3
$ current.grade.last: int 2 1 3
$ grade.history.last: int 3 2 4
Обратите внимание, что значения не выстраиваются в линию, поскольку исходные факторы имели разные уровни. Каков правильный способ сделать это с помощью dplyr
?
Я использую R
версии 3.1.1 и dplyr
версии 0.3.0.2
Добавить 'stringsAsFactors = FALSE' при создании вашего набора данных, и ваш код будет работать нормально, см.' 'Data.frame'. См. Также [здесь] (http://stackoverflow.com/questions/3418128/how-to-convert-a-factor-to-an-integer-numeric-without-a-loss-of-information) для общего понимания факторы или [здесь] (http://stackoverflow.com/questions/2851015/convert-data-frame-columns-from-factors-to-characters) –
@David Кажется, что OP (довольно разумно) * хочет * здесь. –
@ KonradRudolph, что также может быть правдой (я не читал фон, а скорее проблему, с которой они сталкиваются), хотя я не уверен, как вы определяете * достаточно разумно * (память мудрая?). –