2015-07-10 64 views
0

我試圖計算實驗中每個主題的反應時間分數,但只使用一組試驗,取決於主題的性能。對於循環,列表和條件分析(在R中)

每個科目都參加了16個項目的測驗。然後他們對同樣的16個項目進行了測試。對於每個科目,我都想得到平均反應時間分數,但僅限於那些他們都有問題和試題正確的項目

我的數據文件看起來是這樣的:

subject quizitem1 quizitem2 testitem1 testitem2 RT1 RT2 
1   1   0   1   1   5  10 
2   0   1   0   1   3  7 

理想情況下,我想僅僅考慮的RT下都quizitem[i]testitem[i]用ls項目i時表示每個科目的平均反應時間的另一列。使用上面的例子中,列應該是這樣的:

newDV 
5 
7 

...因爲受1只得到了第1項正確兩個措施,並受2只拿到了第2項關於這兩項措施是正確的。

我已經開始製作三個向量,以幫助保持相關項目的數據按正確順序排列。

quizacclist = c(quizitem1, quizitem2) 
testacclist = c(testitem1, testitem2) 
RTlist = c(RT1, RT2) 

所有這些新的載體是很長,從所有科目的RT2獻給所有科目,等等追加RT1秒。

我試過使用for循環來計算這一列,但不能完全弄清楚限制分析符合上述條件的條件是什麼條件。

這裏是我的嘗試:

attach(df) 
i = 0 
j = 0 

for(i in subject) { 
    for(j in 1:16) { 
     denominator[i] = sum(quizacclist[i*j]==1 & testacclist[i*j]==1) 
     qualifiedindex[i] = ?? 
     numerator[i] = sum(RTlist[qualifiedindex]) 
     meanqualifiedRT[i] = numerator[i]/denominator[i] 
     } 
    } 

denominator變量應該計算爲其中受試者已經得到雙方的測驗和考試題正確的項目數。

numerator變量應該加起來爲變量denominator貢獻的項目的所有RTs;也就是說,對該項目進行了測驗並測試了正確的問題。

我現在的具體問題是:如何指定此qualifiedindex?正如我設想的那樣,它應該是一個列表清單;宏列表中的每個索引對應於主題,並且每個主題都有他們自己的列表,該列表指出quizacclist[i]testacclist[i]下哪些項目具有1s。

例如:

Qualifiedindex = ([1,5,9],[2,6],[8,16],etc) 

理想的情況下,這種結構將允許numerator變量最多隻能加滿足精度條件的RT。

如何創建此列表中的列表? 或者,有沒有更好的方式來實現我的目標? 任何幫助,將不勝感激!

由於提前, 亞當

回答

0

下面是使用基礎R reshape一個解決方案,然後dplyr

quiz_long <- reshape(quiz, direction = "long", 
    varying = -1, sep = "", idvar = "subject", 
    timevar = "question") 
quiz_long %>% 
    filter(quizitem == 1 & testitem == 1) %>% 
    group_by(subject) %>% 
    summarise(mean(RT)) 

注意這將只包括科目誰了至少一個可用的問題。對於這些主題將有NA的替代方案:

quiz_long %>% 
    mutate(RT = replace(RT, quizitem != 1 | testitem != 1, NA)) %>% 
    group_by(subject) %>% 
    summarise(mean_RT = mean(RT, na.rm = TRUE)) 
0

感謝您的有希望的建議尼克!我已經試過了,但目前卡住處理由mutate功能提示的錯誤,其中替換的行數不同於數據。爲什麼會出現這種情況的普遍原因?

再次感謝, Adam