2013-07-03 54 views
1

我有一個數據框,看起來像下面,它繼續到主題22 Beta是相關的措施。減去每個度量的具體條件

Subject ROI Block Condition Beta 
1 motor1 1 nopred_noom -2.8653 
1 motor1 1 pred_noom -2.9126 
1 motor1 1 nopred_om -2.8688 
1 motor1 1 pred_om -2.9098 
1 motor1 1 null -2.7717 
1 motor1 2 nopred_noom -2.2382 
1 motor1 2 pred_noom -2.0583 
1 motor1 2 nopred_om -2.2207 
1 motor1 2 pred_om -2.1928 
1 motor1 2 null -2.1166 
1 motor1 3 nopred_noom -1.5992 
1 motor1 3 pred_noom -1.5493 
1 motor1 3 nopred_om -1.5230 
1 motor1 3 pred_om -1.4851 
1 motor1 3 null -1.5624 
2 motor1 1 nopred_noom -1.1354 
2 motor1 1 pred_noom -1.1614 
2 motor1 1 nopred_om -1.2779 
2 motor1 1 pred_om -1.1234 
2 motor1 1 null -1.2203 
2 motor1 2 nopred_noom -1.5728 
2 motor1 2 pred_noom -1.6614 
2 motor1 2 nopred_om -1.7076 
2 motor1 2 pred_om -1.7702 
2 motor1 2 null -1.4170 

有5分的條件,但我想使用條件null作爲基線,並希望在每個相應塊並受來自其他條件中減去它。

所以我會在主題1,塊1中從Beta測量條件「null」中減去Beta,然後我想在主題1中使用beta值「null」,而在主題1中使用測量值block2 1,block2等等。

null條件發生每5個條件,我懷疑我需要使用循環,但我對R很新,我不知道如何做到這一點。

任何幫助表示讚賞! 謝謝:)

回答

1

這需要所謂的「拆分應用聯合」方法。有很多可能性來做到這一點。對於初學者來說最簡單的就是打包plyr,因爲它的語法很好。

library(plyr) 
DF <- ddply(DF, .(Subject,ROI,Block), transform, Beta0 = Beta-Beta[Condition=="null"]) 

# Subject ROI Block Condition Beta Beta0 
# 1  1 motor1  1 nopred_noom -2.8653 -0.0936 
# 2  1 motor1  1 pred_noom -2.9126 -0.1409 
# 3  1 motor1  1 nopred_om -2.8688 -0.0971 
# 4  1 motor1  1  pred_om -2.9098 -0.1381 
# 5  1 motor1  1  null -2.7717 0.0000 
# 6  1 motor1  2 nopred_noom -2.2382 -0.1216 
# 7  1 motor1  2 pred_noom -2.0583 0.0583 
# 8  1 motor1  2 nopred_om -2.2207 -0.1041 
# 9  1 motor1  2  pred_om -2.1928 -0.0762 
# 10  1 motor1  2  null -2.1166 0.0000 
# <snip> 
+0

哇,這太神奇了!感謝您的幫助:) – junophil

0

進入data.table也很有趣。或者,也許我只是在DT踢...

+1與數據可回答的問題。

df <- read.table(text ='Subject ROI Block Condition Beta 
1 motor1 1 nopred_noom -2.8653 
1 motor1 1 pred_noom -2.9126 
1 motor1 1 nopred_om -2.8688 
1 motor1 1 pred_om -2.9098 
1 motor1 1 null -2.7717 
1 motor1 2 nopred_noom -2.2382 
1 motor1 2 pred_noom -2.0583 
1 motor1 2 nopred_om -2.2207 
1 motor1 2 pred_om -2.1928 
1 motor1 2 null -2.1166 
1 motor1 3 nopred_noom -1.5992 
1 motor1 3 pred_noom -1.5493 
1 motor1 3 nopred_om -1.5230 
1 motor1 3 pred_om -1.4851 
1 motor1 3 null -1.5624 
2 motor1 1 nopred_noom -1.1354 
2 motor1 1 pred_noom -1.1614 
2 motor1 1 nopred_om -1.2779 
2 motor1 1 pred_om -1.1234 
2 motor1 1 null -1.2203 
2 motor1 2 nopred_noom -1.5728 
2 motor1 2 pred_noom -1.6614 
2 motor1 2 nopred_om -1.7076 
2 motor1 2 pred_om -1.7702 
2 motor1 2 null -1.4170', header=T) 

dt <- data.table(df) 

delta_maker <- function(x) { 
    return(x - x[5]) 
} 

dt[, delta := delta_maker(Beta), by = list(ROI, Subject, Block)] 

#Subject ROI Block Condition Beta delta 
#1:  1 motor1  1 nopred_noom -2.8653 -0.0936 
#2:  1 motor1  1 pred_noom -2.9126 -0.1409 
#3:  1 motor1  1 nopred_om -2.8688 -0.0971 
#4:  1 motor1  1  pred_om -2.9098 -0.1381 
#5:  1 motor1  1  null -2.7717 0.0000 
#6:  1 motor1  2 nopred_noom -2.2382 -0.1216 
#7:  1 motor1  2 pred_noom -2.0583 0.0583 
#8:  1 motor1  2 nopred_om -2.2207 -0.1041 
#9:  1 motor1  2  pred_om -2.1928 -0.0762 
#10:  1 motor1  2  null -2.1166 0.0000 
#11:  1 motor1  3 nopred_noom -1.5992 -0.0368 
#12:  1 motor1  3 pred_noom -1.5493 0.0131 
#13:  1 motor1  3 nopred_om -1.5230 0.0394 
#14:  1 motor1  3  pred_om -1.4851 0.0773 
#15:  1 motor1  3  null -1.5624 0.0000 
#16:  2 motor1  1 nopred_noom -1.1354 0.0849 
#17:  2 motor1  1 pred_noom -1.1614 0.0589 
#18:  2 motor1  1 nopred_om -1.2779 -0.0576 
#19:  2 motor1  1  pred_om -1.1234 0.0969 
#20:  2 motor1  1  null -1.2203 0.0000 
#21:  2 motor1  2 nopred_noom -1.5728 -0.1558 
#22:  2 motor1  2 pred_noom -1.6614 -0.2444 
#23:  2 motor1  2 nopred_om -1.7076 -0.2906 
#24:  2 motor1  2  pred_om -1.7702 -0.3532 
#25:  2 motor1  2  null -1.4170 0.0000 
#Subject ROI Block Condition Beta delta 
+0

這使用了您首先需要安裝的附加軟件包[datatable](http://cran.r-project.org/web/packages/data.table/index.html)然後'library(datatable)'。 – dirkjot

1

下面是對上述任務基礎R代碼:

#-- split 
dfs <- split(df, list(df$Block, df$Subject)) 
#-- apply 
Beta0<-NULL 
for (i in 1:length(dfs)) 
{Beta0 <- dfs[[i]]$Beta - dfs[[i]][dfs[[i]]$Condition=="null",]$Beta; 
dfs[[i]][,"Beta0"] <- Beta0} 
#-- recombine 
dfrc <- do.call(rbind, dfs) 

DF =原始數據幀; dfs =包含所有拆分子組的列表; dfrc =新的數據框,應該重現上面顯示的新列「Beta0」的結果。

我發佈了這個,因爲我有一個類似的數據集 - 同樣 - 在一個塊中爲條件「null」缺少值「Beta」。 Plyr產生了一個錯誤消息「參數意味着行數不同:x,0」並且不計算。但是,上述代碼爲該塊生成了NAs,但計算了其餘所有內容。