2016-02-25 3 views
1

Образец данных структурирован следующим образом:Вычислить верхние% переменные в соответствии с условием

Individ <- data.frame(Participant = c("Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", 
             "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry"), 
         Time = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), 
         Power = c(400, 250, 180, 500, 300, 450, 600, 512, 300, 500, 450, 200, 402, 210, 130, 520, 310, 451, 608, 582, 390, 570, NA, NA)) 

рассчитать скользящее среднее Power в течение двух, трех и четырех второго периода. Я знаю, что я могу подмножество каждый скользящего среднего (с учетом изменений в Participant), выполнив следующие действия:

Individ$TwoSec <- ave(Individ$Power, Individ$Participant, 
          FUN= function(x) rollapply(x, 2, mean, na.rm = TRUE, fill = NA)) 
Individ$ThreeSec <- ave(Individ$Power, Individ$Participant, 
          FUN= function(x) rollapply(x, 3, mean, na.rm = TRUE, fill = NA)) 
Individ$FourSec <- ave(Individ$Power, Individ$Participant, 
          FUN= function(x) rollapply(x, 4, mean, na.rm = TRUE, fill = NA)) 

теперь я хочу, чтобы найти топ 5% Power для каждого скользящего среднего (TwoSec, ThreeSec и FourSec). Как это сделать, чтобы учесть изменение в Name и рассчитать это?

My actual data.frame> 3 миллиона строк, поэтому было бы предпочтительным быстрое решение.

ответ

3

Мы могли бы попробовать

library(data.table) 
library(RcppRoll) 
setDT(Individ)[, lapply(2:4, function(n) { 
     r1 <- roll_mean(Power, n, fill=NA) 
     r2 <- r1[order(-r1)] 
     r2[seq(ceiling(.N*0.05))]}) , by = Participant] 
+1

Благодарим Вас за 'data.table' решения для повышения мощности. – user2716568

+0

Это также включает скользящее среднее значение мощности. Я подсчитал, что ОК, я просто хочу перебирать каждую скользящую среднюю колонку (например, Individ $ TwoSec, Individu $ ThreeSec), чтобы найти верхние 5% в каждом, за участника. Можете ли вы отредактировать или добавить ответ, который опускает скользящую среднюю функцию? – user2716568

+0

@ user2716568 Не могли бы вы опубликовать это как новый вопрос? – akrun

Смежные вопросы