【问题标题】:How can I find a subsequent trial based on a condition?如何根据条件找到后续试验?
【发布时间】:2018-12-20 23:43:38
【问题描述】:

我正在使用 R 来处理一个包含 20,000 多行的大型数据集(数据集)。在我的数据中,我有三个重要的列要关注这个问题:Trial_Nr(由 90 个试验组成)、秒(以 0.02 秒为增量增加)和威胁(对威胁的固定:1=是,0=否,NA )。在每次试验中,我需要回答最初何时关注威胁(1),他们需要多长时间才能不关注威胁(0)。所以基本上,在每次试验中,我需要找到第一个威胁 = 1 和随后的威胁 = 0 并减去时间。我可以使用此代码获得第一个威胁:

initalfixthreat <- dataset %>%
                   group_by(Trial_Nr) %>%
                  slice(which(threat == '1')[1])

我不知道如何在该试用号内获得后续威胁=0。

这是数据示例(抱歉不知道如何更好地格式化):

所以对于 Trial_Nr=1,我会对 689.9 秒- 689.8 感兴趣。 对于 Trial_Nr=2,我想要 690.04-689.96。

如果我不清楚,请告诉我,谢谢大家的帮助!

【问题讨论】:

  • 运行 dput(dataset) 并将其添加到您的帖子而不是图片中。这样,人们只需将数据复制并粘贴到他们的 R 会话中

标签: r subsequence


【解决方案1】:

一种方法是:

library(dplyr)

df %>%
  group_by(Trial_Nr) %>%
  filter(!is.na(threat)) %>%
  mutate(flag = ifelse(threat == 1, 1, threat - lag(threat))) %>% 
  filter(abs(flag) == 1 & !duplicated(flag)) %>%
  summarise(timediff = ifelse(length(seconds) == 1, NA, diff(seconds)))

# A tibble: 2 x 2
  Trial_Nr timediff
     <int>  <dbl>
1        1 0.1   
2        2 0.0800

数据:

df <- structure(list(Trial_Nr = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L), seconds = c(689.76, 689.78, 689.8, 689.82, 
689.84, 689.86, 689.88, 689.9, 689.92, 689.94, 689.96, 689.98, 
690, 690.02, 690.04), threat = c(0L, 0L, 1L, 1L, 1L, NA, NA, 
0L, 1L, 0L, 1L, NA, NA, 1L, 0L)), class = "data.frame", row.names = c(NA, 
-15L))

【讨论】:

  • 所以当我这样做时,我得到了这个错误:summarise_impl(.data, dots) 中的错误:列timediff 的长度必须为 1(汇总值),而不是 0。你知道为什么这可能是?
  • 可能是因为在某些试验中,威胁并非不被关注/从未被关注。查看更新的答案。
  • 谢谢杰!如果您有时间,请快速提问——您能解释一下延迟的作用吗?
  • dplyr::lag,默认情况下,返回上一行的值 - 在这种情况下,从当前值中减去上一个威胁值以检测状态变化。
猜你喜欢
  • 2021-06-10
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2012-11-16
  • 2011-04-26
相关资源
最近更新 更多