如果在使用subset()然后使用dcast或tapply时没有观察,则插入NA&#s

时间:2014-11-26 13:53:08

标签: r subset na reshape2 tapply

我有以下数据框(这只是数据框的头部)。 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,在该特定条件下,他没有满足子集需求的观察。有没有人有办法做到这一点? 任何帮助将不胜感激。

最佳, 阿亚拉

2 个答案:

答案 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