вычитание определенного условия для каждой меры

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

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

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


person junophil    schedule 03.07.2013    source источник


Ответы (3)


Для этого нужен так называемый подход «разделить-применить-объединить». Есть много возможностей сделать это. Самым простым для новичка является пакет 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>
person Roland    schedule 03.07.2013

Вот базовый код 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».

Я опубликовал это, потому что у меня был аналогичный набор данных с - аналогично - отсутствующим значением «бета» для условия «нуль» в одном блоке. Plyr выдал сообщение об ошибке «Аргументы подразумевают разное количество строк: x, 0» и не вычислил. Приведенный выше код, однако, создал NA для этого блока, но вычислил все остальные.

person ZeroBound    schedule 14.01.2015

Попасть в 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
person intra    schedule 03.07.2013
comment
при этом используется дополнительный пакет datatable, который вам сначала нужно установить, а затем library(datatable). - person dirkjot; 24.06.2014