用R和dplyr计算响应的持续时间? group_by的一些问题

时间:2018-03-04 11:22:59

标签: r dplyr mutate

我在一组条件下测量了一组动物('主题')随着时间的推移(' y') ('因子1''因子2&#39)。在持续时间=' z的情况下,在20分钟的固定时间内连续测量响应。得到了。

对于这些数据,我想计算所花费的时间(此处表示为#39;持续时间')' y'在刺激结束后返回其基线值(即0),按“主题”,“因子1”和“因子1”对数据进行分组。和' factor2'。这是一个示例数据集

data<-
    data.frame(x=rep(rep(1:20,4),6),y=rnorm(480,mean=4,sd=2),z=rep(3,80),
    factor1=rep(rep(c("A","B"),each=20),4),
    factor2=rep(c(rep("C",20),rep("D",20),rep("C",20),rep("D",20))),
    subject=rep(factor(1:6),each=80))

我试图用dplyr解决这个问题:

library("dplyr")
data %>%
    group_by(subject,factor1,factor2) %>%
    mutate(duration=nth(x,first(which(y<=0)))-z)

这会在mutate_impl(.data,dots)中产生错误&#34;错误:   评估错误:缺少需要TRUE / FALSE的值。&#34;

我认为这可能会发生,因为有些科目从未回到基线,所以我尝试通过将这些观察结果设置为&#39;持续时间&#39; = 20来修改代码:

data %>%
group_by(subject,factor1,factor2) %>%
mutate(duration=ifelse(
(nth(x,first(which(y<=0)))-z)<=(20-z),
(nth(x,first(which(y<=0)))-z),20)
)

但是,错误消息仍为&#34; mutate_impl(.data,dots)中的错误:   评估错误:缺少需要TRUE / FALSE的值。&#34;

在这两种情况下,当我删除&#34; group_by&#34;时,错误消息就会消失。声明,但我无法弄清楚为什么(除了一些人从未回到基线的事实)。

我如何才能最好地解决这个问题?我想我可能会遗漏一些非常明显的东西......

非常感谢, 安德烈亚斯

1 个答案:

答案 0 :(得分:0)

查看我的评论。您的which()调用在某些组中评估为NA。所以你需要指定如何处理这些情况。例如,用NA代替:

data %>%
  group_by(subject,factor1,factor2) %>%
  mutate(duration= ifelse(is.na(first(which(y<=0))),NA, nth(x,first(which(y<=0)))-z))

另外,我建议不要使用因素,如果你不明白它们实际上是什么,它们会搞得很多(我没有,所以我不使用它们)。您可以改用字符。