Выбор первого экземпляра темы в длинном и широком файле в 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 ответа
Ответ @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))