Извлеките индексы верхних n-х значений для каждого элемента в кадре данных

У меня есть временная отметка о 4 студентах, отвечающих на онлайн-анкету в кадре данных. 1-й столбец — это время, 2-й — идентификатор студента (id: 1,2,3,4). Ниже приведен смоделированный кадр данных:

DF <- data.frame(cbind(Time=1:60, ID=sample(1:4, 60, replace=T)))

Я пытаюсь извлечь индексы первых 5-ти записей для каждого ученика, чтобы извлечь метку времени записи. Это должно вернуть в нем массив из 20 значений (4 студента X первые 5 записей).

Я пробовал использовать rank(), order() в сочетании с ddply(), но безуспешно. Любые хорошие предложения? Спасибо!


person SeanM    schedule 19.06.2012    source источник
comment
см. мой ответ на этот вопрос .com/questions/11109828/   -  person Matthew Plourde    schedule 20.06.2012
comment
Спасибо, @mplourde! Я полностью пропустил, что tail() может указывать произвольную длину!   -  person SeanM    schedule 20.06.2012


Ответы (1)


Ответ, который mplourde дал в комментарии, великолепен, но вы можете сделать это и с plyr:

library(plyr)
ddply(DF, .(ID), function(x) data.frame(Time_sorted=tail(sort(x$Time))))

и версия by:

do.call(rbind, by(DF, DF$ID, function(x) tail(x[order(x$Time),])))
person Justin    schedule 19.06.2012
comment
ddply(DF, .(ID), function(x) data.frame(Time_sorted=tail(sort(x$Time),5))), если вам нужны первые 5 записей и набор результатов из 20. - person John; 20.06.2012
comment
Спасибо @Justin, @John! Я предполагаю, что для первых 5 записей следует использовать head() вместо tail(), что дает: ddply(DF, .(ID), function(x) data.frame(Time_sorted=head(sort(x$Time),5))) - person SeanM; 20.06.2012
comment
@SeanM на самом деле, ты хочешь tail(..., 5). Сортировка по умолчанию расставляет элементы в порядке возрастания. Если вы используете head, вы хотите добавить decreasing=TRUE к вызову sort. - person Justin; 20.06.2012