У меня есть кадр данных, который содержит историю событий, и я хочу проверить его целостность, проверив, соответствует ли последнее событие для каждого идентификационного номера текущему значению в системе для этого идентификационного номера. Данные кодируются как факторы. Следующий игровой кадр данных является минимальным примером:
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")))
который дает выход
> 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