2016-02-15 2 views
1

У меня есть вектор чисел (nth_RT) и кадр данных (ДФ):значения Mapping от вектора к кадру данных: Вычисление процентиля

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 для второго блока 1-й предмет, 50-й процентиль RT для третьего блок 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]) 

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

ответ

2

Я думаю, что вектор 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 

Тогда мы можем использовать цикл, чтобы пройти через каждый 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 всех строк для г-го 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]) 

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

+0

спасибо большое за ответ! он работал отлично. действительно, я думаю, я определенно должен проверить некоторые сведения о формулах. – MariKo

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