Выбор первого экземпляра темы в длинном и широком файле в R

У меня большой набор данных, который длинный и широкий, как это:

 StudentID <- factor(c(1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5))
 Grade <- factor(c(10, 10, 11, 11, 11, 10, 10, 10, 12, 9, 9))
 data <- data.frame(StudentID, Grade)

Для каждого студенческого идентификатора потенциально существует много экземпляров их класса (которые всегда одинаковы).

Какой самый эффективный способ сократить эти данные, чтобы у каждого ученика был только один класс?

До сих пор я пытался использовать функцию разделения, чтобы создать список всех оценок, перечисленных для каждого учащегося, а затем просто выбрать только первый элемент в списке:

 index.byID <- split(data$Grade, data$StudentID)
 sapply(index.byID, "[[", 1) 

Поскольку мои данные настолько велики (300 КБ + строк), индексация занимает более 25 минут.

Любая помощь, которую вы можете оказать, будет отличной!

,,

2 ответа

Решение

Ты можешь попробовать unique

unique(data)

Ответ @akrun так же прост, как и для ответа на вопрос. Но если вы хотите сохранить значение других столбцов первой записи, я считаю использование ddply из пакета plyr чистой и эффективной альтернативой. Вот код для этого подхода.

library(plyr)

StudentID <- factor(c(1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5))
Grade     <- factor(c(10, 10, 11, 11, 11, 10, 10, 10, 12, 9, 9))
data      <- data.frame(StudentID, Grade, 
                        ExtraColumn=1:length(StudentID))
ddply(data, .(StudentID, Grade), function(x) head(x, 1))
Другие вопросы по тегам