Отображение значений из вектора во фрейм данных: вычисление процентиля

У меня есть вектор чисел (nth_RT) и кадр данных (df):

nth_RT 
[1] 0.61 0.47 0.50 0.53 0.50 0.56


df
#    Subject    RT Trial Block  Rank
#     (int) (int) (int) (int) (int)
#1        1   234     1     1     1
#2        1   239     3     1     2
#3        1   563     2     1     3
#4        1   230     1     2     1
#5        1   234     3     2     2
#6        1   467     2     2     3
#7        1   111     3     3     1
#8        1   466     2     3     2
#9        1   543     1     3     3
#10       2    44     2     1     1
#11       2   223     3     1     2
#12       2   343     1     1     3
#13       2    34     2     2     1
#14       2   242     3     2     2
#15       2   324     1     2     3
#16       2    54     1     3     1
#17       2   345     3     3     2
#18       2   656     2     3     3

Я хочу рассчитать и добавить в качестве нового столбца (nth) n-й процентиль для каждого блока по предмету, т. е. 61-й процентиль RT для 1-го блока 1-го субъекта, 47-й процентиль RT для 2-й блок 1-й субъект, 50-й процентиль RT для 3-го блока 1-й субъект, 53-й процентиль 1-го блока 2-й участник и т. д. Таким образом, кадр данных будет выглядеть следующим образом:

df
#    Subject    RT Trial Block  Rank  nth
#1        1   234     1     1     1   310.28
#2        1   239     3     1     2   310.28
#3        1   563     2     1     3   310.28
#4        1   230     1     2     1   233.76
#5        1   234     3     2     2   233.76
#6        1   467     2     2     3   233.76
#7        1   111     3     3     1   466
#8        1   466     2     3     2   466
#9        1   543     1     3     3   466
#10       2    44     2     1     1   230.2
#11       2   223     3     1     2   230.2
#12       2   343     1     1     3   230.2
#13       2    34     2     2     1   242
#14       2   242     3     2     2   242
#15       2   324     1     2     3   242
#16       2    54     1     3     1   382.32
#17       2   345     3     3     2   382.32
#18       2   656     2     3     3   382.32

У меня есть код для одного блока на участника, но он не работает:

nth_RT <-quantile(df$RT ~ Block * Subject, nth_RT[1])

Есть ли лучший способ расчета процентилей и добавления их в качестве нового столбца? Я предполагаю, что можно использовать цикл или функцию для последовательного считывания каждого значения из вектора, а затем вычислять процентили.


person MariKo    schedule 15.02.2016    source источник


Ответы (1)


Мне кажется вектор nth_RT не имеет четкого соответствия вашим Block и Subject в df. Поэтому я предлагаю вам создать матрицу или data.frame, чтобы четко показать соответствие. Например,

grid <- expand.grid(Block = unique(df$Block), Subject = unique(df$Subject))
grid_nth_RT <- cbind(grid, nth_RT)

Тогда вы получите:

> grid_nth_RT
  Block Subject nth_RT
1     1       1   0.61
2     2       1   0.47
3     3       1   0.50
4     1       2   0.53
5     2       2   0.50
6     3       2   0.56

Затем мы можем использовать цикл for для прохождения каждой пары Block-Subject.

df$nth <- array(0, nrow(df))
for(i in 1:nrow(grid_nth_RT)) {
  index <- df$Block == grid_nth_RT[i,"Block"] &
           df$Subject == grid_nth_RT[i,"Subject"]
  df$nth[index] <- quantile(df[index,"RT"], grid_nth_RT[i,"nth_RT"])
}

Мы находим index всех строк для i-го Block-Subject. Затем мы можем подмножество df[index,"RT"]. Мы вычисляем квантиль df[index,"RT"] в процентах grid_nth_RT[i,"nth_RT"]. Мы сохраняем результат в df$nth[index].

> df
   Subject  RT Trial Block Rank    nth
1        1 234     1     1    1 310.28
2        1 239     3     1    2 310.28
3        1 563     2     1    3 310.28
4        1 230     1     2    1 233.76
5        1 234     3     2    2 233.76
6        1 467     2     2    3 233.76
7        1 111     3     3    1 466.00
8        1 466     2     3    2 466.00
9        1 543     1     3    3 466.00
10       2  44     2     1    1 230.20
11       2 223     3     1    2 230.20
12       2 343     1     1    3 230.20
13       2  34     2     2    1 242.00
14       2 242     3     2    2 242.00
15       2 324     1     2    3 242.00
16       2  54     1     3    1 382.32
17       2 345     3     3    2 382.32
18       2 656     2     3    3 382.32

Кстати, из вашего кода

quantile(df$RT ~ Block * Subject, nth_RT[1])

Я думаю, у вас есть некоторое недопонимание по поводу ~. Вещи с ~ в R называются formula. Вы можете проверить эту страницу https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html, чтобы узнать больше о formula в R.

person Po C.    schedule 15.02.2016
comment
большое спасибо за ваш ответ! это сработало отлично. действительно, я думаю, мне обязательно нужно проверить кое-какую информацию о формулах. - person MariKo; 15.02.2016