使用dcast时如何获取每个ID的value.var?

时间:2014-12-03 17:08:14

标签: r dplyr reshape2

我试着改写我的问题。 我有以下数据框,bb1,我正在使用dply的dcast对其进行分解。在这个例子中,我想通过“条件”(subject~条件)计算每个“主题”在“rt”列中有多少obersvations,但我只想要具有满足a的“z.score”的观察克服条件。在下面的示例中,我使用了abs(z.score)> 1.5,但有时它会是1.5,有时是1,有时是2. 1.5只是一个例子。同样在下面的示例中,我计算了长度,但我也希望能够计算平均值(例如,“条件”的每个“主题”的“rt”列的平均值仅适用于具有“z.score”的观察值“> 1.5,所以这里的长度只是一个例子。”

require(reshape2)
require(dplyr)
bb1 = 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(1,1,2,4,3,3,4,4), z.score=c(0.2,0.3,0.2,0.3,0.3,0.2,0.2,0.2))

> bb1
#     subject  rt ac condition z.score
# 1      99 100  1         1     0.2
# 2      99 150  1         1     0.3
# 3      99   2  1         2     0.2
# 4      99   4  1         4     0.3
# 5      99  10  1         3     0.3
# 6      11  15  1         3     0.2
# 7      11   1  1         4     0.2
# 8      11   2  1         4     0.2

bb1 %>% 
  group_by(subject, condition) %>% 
  summarise(n = length(rt[abs(z.score) > 1.5])) %>% 
  dcast(subject ~ condition, value.var = "n")

#   subject  1  2 3 4
# 1      11 NA NA 0 0
# 2      99  0  0 0 0

我的问题是,如果我想为每个主题计算value.var =“n”,我应该如何使用dcast部分?而不是每个受试者的条件?我希望得到每个主题的value.var。这实际上意味着我想计算每一行的边距。但是我不想得到subject.var作为subject~条件,我想只得到边距(即,为每个主题得到value.var跨越条件)并将其保存为data.frame。 在上面的bb1中,我想得到类似的东西

#   subject rt
# 1 11  0
# 2 99  0

考虑到两个科目(即科目11和科目99)在满足z.score限制的任何条件下都没有观察,我需要为两者获得0。

我希望我的问题现在更好

任何帮助将不胜感激。 谢谢, 阿亚拉

2 个答案:

答案 0 :(得分:1)

看起来您只想为每个subject制作一个摘要数据集,显示每个主题符合z.score条件的次数。使用 dplyr (组摘要的众多选项之一):

bb1 %>% group_by(subject) %>% 
    summarise(rt = sum(abs(z.score) > 1.5)) 

Source: local data frame [2 x 2]

  subject rt
1      11  0
2      99  0

如果您真的想使用dcast,只需将聚合函数从默认length更改为sum即可。请注意,您可以通过在~中的代字号右侧(dcast)中将所需名称放在引号中来命名新列。

bb1 %>% group_by(subject, condition) %>% 
    summarise(n = sum(abs(z.score) > 1.5))  %>% 
    dcast(subject ~ "rt", value.var = "n", fun = sum)

  subject rt
1      11  0
2      99  0

答案 1 :(得分:0)

所以你只想知道你对每个科目有多少测量?我不确定我是在理解你在寻找什么,但是如果我能得到你想要的东西,那么我就像这样使用plyr:

 library(plyr)
 ddply(bb1, c("subject"), function(x) nrow(x))
编辑:我喜欢beginneR的答案,稍作修改。如果你想要计算z.score高于某个值的主题数量(我没有看到任何高于1.5,所以我使用0.2作为例子),这是一种方式:

 count(bb1[bb1$z.score > 0.2, ], "subject")