如何根据条件找到后续试验?
How can I find a subsequent trial based on a condition?
我正在使用 R 来操作包含 20,000 多行的大型数据集(数据集)。在我的数据中,我有三个重要的列来关注这个问题:Trial_Nr(由 90 次试验组成)、秒(以 .02 秒的增量增加)和威胁(对威胁的固定:1=是,0 =不,不适用)。在每次试验中,我需要回答当最初注视威胁 (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。
如有不明之处请告知,谢谢大家的帮助!
一种方法是:
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))
我正在使用 R 来操作包含 20,000 多行的大型数据集(数据集)。在我的数据中,我有三个重要的列来关注这个问题:Trial_Nr(由 90 次试验组成)、秒(以 .02 秒的增量增加)和威胁(对威胁的固定:1=是,0 =不,不适用)。在每次试验中,我需要回答当最初注视威胁 (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。
如有不明之处请告知,谢谢大家的帮助!
一种方法是:
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))