我试着改写我的问题。 我有以下数据框,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。
我希望我的问题现在更好
任何帮助将不胜感激。 谢谢, 阿亚拉
答案 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")