我有一个看似如下的数据框,它继续到主题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,在subject1,block 1中的其他条件中从Beta度量中调整“null”但是我想使用来自subject1的beta值“null”,block2用于主题1中的度量,block2等等。
每隔5个条件就会出现null条件,我怀疑我需要使用循环,但我对R很新,我不知道该怎么做。
任何帮助表示赞赏!!! 谢谢:))
答案 0 :(得分:1)
这需要所谓的“拆分 - 应用 - 组合”方法。有很多可能性来做到这一点。对于初学者来说最简单的是package 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>
答案 1 :(得分: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”并且d dnot计算。但是,上面的代码为该块生成了NA,但计算了所有其余的。
答案 2 :(得分: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