我有以下数据框(这只是数据框的头部)。 ID列是主题(我在数据框中有更多主题,不仅是主题#99)。我想计算平均值" rt" by" subject"和"条件"仅适用于z.score(绝对值)小于1的观测值。
> b
subject rt ac condition z.score
1 99 1253 1 200_9 1.20862682
2 99 1895 1 102_2 2.95813507
3 99 1049 1 68_1 1.16862102
4 99 1732 1 68_9 2.94415384
5 99 765 1 34_9 -0.63991180
7 99 1016 1 68_2 -0.03191493
我知道我可以在对数据进行子集化之后使用tapply或dcast(来自reshape2)来完成它:
b1< - subset(b,abs(z.score)< 1)
b2< - dcast(b1,subject~condition,mean,value.var =" rt")
subject 34_1 34_2 34_9 68_1 68_2 68_9 102_1 102_2 102_9 200_1 200_2 200_9
1 99 1028.5714 957.5385 861.6818 837.0000 969.7222 856.4000 912.5556 977.7273 858.7800 1006.0000 1015.3684 913.2449
2 5203 957.8889 815.2500 845.7750 933.0000 893.0000 883.0435 926.0000 879.2778 813.7308 804.2857 803.8125 843.7200
3 5205 1456.3333 1008.4286 850.7170 1142.4444 910.4706 998.4667 935.2500 980.9167 897.4681 1040.8000 838.7917 819.9710
4 5306 1022.2000 940.5882 904.6562 1525.0000 1216.0000 929.5167 955.8571 981.7500 902.8913 997.6000 924.6818 883.4583
5 5307 1396.1250 1217.1111 1044.4038 1055.5000 1115.6000 980.5833 1003.5714 1482.8571 941.4490 1091.5556 1125.2143 989.4918
6 5308 659.8571 904.2857 966.7755 960.9091 1048.6000 904.5082 836.2000 1753.6667 926.0400 870.2222 1066.6667 930.7500
在上面b1的例子中,每个受试者都有符合子集要求的观察结果。 然而,对于某个主题,我可能在我的子集之后没有观察到。在这种情况下,我希望在特定条件下获得b2中的NA,在该特定条件下,他没有满足子集需求的观察。有没有人有办法做到这一点? 任何帮助将不胜感激。
最佳, 阿亚拉
答案 0 :(得分:2)
drop
中有一个dcast
参数,您可以在这种情况下使用,但您需要将subject
转换为系数。
这是一个第二个主题ID的数据集,其中没有符合条件的值z.score
的绝对值小于1。
library(reshape2)
bb = data.frame(subject=c(99,99,99,99,99,11,11,11), rt=c(100,150,2,4,10,15,1,2),
ac=rep(1,8), condition=c("A","A","B","D","C","C","D","D"),
z.score=c(0.2,0.3,0.2,0.3,.2,2,2,2))
如果您使用dcast
将其重新整理为宽格式,即使使用drop
参数,您也会丢失主题编号11。
dcast(subset(bb, abs(z.score) < 1), subject ~ condition, fun = mean,
value.var = "rt", drop = FALSE)
subject A B C D
1 99 125 2 10 4
让subject
成为一个因素。
bb$subject = factor(bb$subject)
现在,您可dcast
drop = FALSE
将所有主题保留在广泛数据集中。
dcast(subset(bb, abs(z.score) < 1), subject ~ condition, fun = mean,
value.var = "rt", drop = FALSE)
subject A B C D
1 11 NaN NaN NaN NaN
2 99 125 2 10 4
要获得NA
而不是NaN
,您可以使用fill
参数。
dcast(subset(bb, abs(z.score) < 1), subject ~ condition, fun = mean,
value.var = "rt", drop = FALSE, fill = as.numeric(NA))
subject A B C D
1 11 NA NA NA NA
2 99 125 2 10 4
答案 1 :(得分:0)
以下是您的追随者吗?我创建了一个类似的数据集“bb”
library("plyr") ###needed for . function below
bb<- data.frame(subject=c(99,99,99,99,99,11,11,11),rt=c(100,150,2,4,10,15,1,2), ac=rep(1,8) ,condition=c("A","A","B","D","C","C","D","D"), z.score=c(0.2,0.3,0.2,0.3,1.5,-0.3,0.8,0.7))
bb
subject rt ac condition z.score
#1 99 100 1 A 0.2
#2 99 150 1 A 0.3
#3 99 2 1 B 0.2
#4 99 4 1 D 0.3
#5 99 10 1 C 1.5
#6 11 15 1 C -0.3
#7 11 1 1 D 0.8
#8 11 2 1 D 0.7
然后你打电话给dcast,包括子集:
cc<-dcast(bb,subject~condition, mean, value.var = "rt",subset = .(abs(z.score)<1))
cc
subject A B C D
#1 11 NaN NaN 15 1.5
#2 99 125 2 NaN 4.0