【问题标题】:How to get the value.var for each ID when using dcast?使用 dcast 时如何获取每个 ID 的 value.var?
【发布时间】:2014-12-03 17:08:14
【问题描述】:

我尝试重新表述我的问题。 我有以下数据框 bb1,我正在使用 dply 中的 dcast 对其进行解码。在此示例中,我想通过“条件”(主题〜条件)计算每个“主题”的“rt”列中有多少观察值,但我只想要具有满足“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。这实际上意味着我想计算每一行的边距。但是我不想获取主题〜条件的value.var,我只想获取边距(即,跨条件获取每个主题的value.var)并将其保存为data.frame。 在上面的 bb1 我想得到这样的东西

#   subject rt
# 1 11  0
# 2 99  0

因为两个受试者(即受试者 11 和受试者 99)在任何满足 z.score 限制的条件下都没有观察结果,所以我需要为两者都取 0。

我希望我的问题现在更好

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

【问题讨论】:

  • 您可能想要处理您的示例...您所有的 z.scores 都是 0.2 或 0.3,但您要计算它们的条件是 > 1.5。您可以使用n = sum(abs(z.score) > 1.5) 简化您的summarise。但是鉴于您的 1.5 阈值,您的输出是正确的。
  • 您能否添加一个示例来说明您希望输出的样子?可能您想添加行边距(将margins = "condition" 添加到dcast)或者您可能想要dcast(subject ~ ., value.var = "n")
  • @aosmith 我重新表述了我的问题。我尝试了 dcast(subject~ ., value.var = "n"),但我得到 2 和 4(分别针对主题 11 和 99),我应该得到 0,因为在不同条件下他们没有观察到符合我的 z.score 限制

标签: r dplyr reshape2


【解决方案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

【讨论】:

  • 非常感谢!您的建议正是我所需要的,我也学到了很多。
【解决方案2】:

所以您只想知道每个主题有多少个测量值?我不确定我是否理解您要查找的内容,但如果我已经明确了您想要的内容,那么我会像这样使用 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")

【讨论】:

  • 我认为有一个dplyr::group_size function
  • @BondedDust,对(您需要先使用group_by)。或者,您可以使用count(bb1, subject)
  • 有一个对group_by“upstream”的调用,尽管我猜后面的summarise 函数可能会通过折叠行来搞砸事情。似乎summarise 的结果回答了我认为被问到的问题。像你一样,我有点不确定目标到底是什么。不幸的是,人们希望我们使用他们错误的代码来描述期望的结果。
  • @BondedDust,你又是对的。在汇总之后,数据仍将按 subject 分组(不再按条件分组)。这个问题真的不清楚。
猜你喜欢
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2021-11-16
  • 2014-09-28
  • 2018-10-08
  • 2014-05-28
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多