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

问题描述 投票:0回答:1

我在一组条件('factor1','factor2')中测量了一组动物('受试者')中随时间('x')的响应('y')。在给出持续时间='z'的刺激后,连续测量20分钟的固定时间。

对于这些数据,我想计算刺激结束后'y'返回其基线值(0)的时间(此处称为'持续时间'),将数据按'主题','factor1'分组和'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)中的错误:评估错误:缺少需要TRUE / FALSE的值。”

我认为这可能会发生,因为一些主题从未返回到基线,所以我尝试通过将这些观察设置为'duration'= 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)
)

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

在这两种情况下,当我删除“group_by”语句时,错误消息消失,但我无法弄清楚为什么(除了有些人从未返回基线的事实)。

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

非常感谢,Andreas

r dplyr mutate
1个回答
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))

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

© www.soinside.com 2019 - 2024. All rights reserved.