2013-07-03 3 views
1

У меня есть кадр данных, который выглядит следующим образом и продолжается до темы 22 Бета - зависимая мера.вычитание определенного условия для каждого измерения

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 условий, но я хочу использовать условие нуль в качестве базового и хочу вычесть его из других условий в каждом соответствующем блоке и субъект.

поэтому я бы вычитал бета в теме 1, блок 1, условие «null» из бета-мер в других условиях в subject1, block 1, но затем я хочу использовать бета-значение «null» из subject1, block2 для мер в субъекте 1, block2 и т. Д.

null Условие возникает каждые 5 условий, и я подозреваю, что мне нужно использовать цикл, но я совершенно новичок в R, и я не уверен, как это сделать.

любая помощь приветствуется !!! спасибо :)

ответ

1

Для этого нужен так называемый подход «split-apply-comb». Есть много возможностей для этого. Самый простой для новичка - пакет 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» в одном блоке. Plyr выпустил сообщение об ошибке «аргументы подразумевают различное количество строк: x, 0» и di dnot compute. Вышеприведенный код, однако, создал NA для этого блока, но вычислил все остальное.