2012-06-19 1 views
3

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

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

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

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

+0

увидеть мой ответ на этот вопрос HTTP://stackoverflow.com/questions/11109828/subsetting-a-dataframe-based-on-daily-maxima –

+0

Спасибо, @mplourde! Я полностью пропустил этот хвост() может указать пользовательскую длину! – SeanM

ответ

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),]))) 
+1

'ddply (DF,. (ID), function (x) data.frame (Time_sorted = tail (sort (x $ Time), 5)))' если вы хотите, чтобы первые 5-ые записи и результат были равны 20. – John

+0

Спасибо @Justin, @ Джон! Я полагаю, что для первых 5 записей вместо 'tail()' следует использовать 'head()', который дает: 'ddply (DF,. (ID), function (x) data.frame (Time_sorted = head (sort (x $ Time), 5))) ' – SeanM

+0

@SeanM На самом деле вам нужно' tail (..., 5) '. Сортировка по умолчанию помещает вещи в порядке возрастания. Если вы используете 'head', вы хотите добавить' убывание = TRUE' в вызов 'sort'. – Justin