У меня есть данные эксперимента, в котором участникам показывается стимул, а время измеряется непрерывно.
# reprex
df <-
tibble(stim = c(NA, NA, NA, NA, "a", "b", NA, "c", NA, "d", NA, NA, NA),
time = 0:12)
# A tibble: 13 x 2
stim time
<chr> <int>
1 NA 0
2 NA 1
3 NA 2
4 NA 3
5 a 4
6 b 5
7 NA 6
8 c 7
9 NA 8
10 d 9
11 NA 10
12 NA 11
13 NA 12
Я хочу создать обобщенное решение, с использованием функций обратного хода , чтобы отбросить данные за 1 секунду до и через 2 секунды после первого и последнего маркера соответственно.Я думал, что с помощью tidyverse это сработает, но выдает неинформативную ошибку.
df %>%
# store times for first and last stim
mutate(first_stim = drop_na(stim) %>% pull(time) %>% first(),
last_stim = drop_na(stim) %>% pull(time) %>% last()) %>%
# filter df based on new variables
filter(time >= first(first_stim) - 1 &
time <= first(last_stim) + 2)
Error in mutate_impl(.data, dots) : bad value
Поэтому я сделал довольно уродливый базовый код r, чтобы преодолеть эту проблему, изменив mutate:
df2 <- df %>%
mutate(first_stim = .[!is.na(.$stim), "time"][1,1],
last_stim = .[!is.na(.$stim), "time"][nrow(.[!is.na(.$stim), "time"]), 1])
# A tibble: 13 x 4
stim time first_stim last_stim
<chr> <int> <tibble> <tibble>
1 NA 0 4 9
2 NA 1 4 9
3 NA 2 4 9
4 NA 3 4 9
5 a 4 4 9
6 b 5 4 9
7 NA 6 4 9
8 c 7 4 9
9 NA 8 4 9
10 d 9 4 9
11 NA 10 4 9
12 NA 11 4 9
13 NA 12 4 9
Теперь мне нужно будет фильтровать только по новым переменным first_stim - 1
и last_stim + 2
.Но фильтр тоже не работает:
df2 %>%
filter(time >= first(first_stim) - 1 &
time <= first(last_stim) + 2)
Error in filter_impl(.data, quo) :
Not compatible with STRSXP: [type=NULL].
Я смог сделать это в базе R, но это действительно ужасно:
df2[(df2$time >= (df2[[1, "first_stim"]] - 1)) &
(df2$time <= (df2[[1, "last_stim"]] + 2))
,]
Желаемый результат должен выглядеть следующим образом:
# A tibble: 13 x 2
stim time
<chr> <int>
4 NA 3
5 a 4
6 b 5
7 NA 6
8 c 7
9 NA 8
10 d 9
11 NA 10
12 NA 11
Я считаю, что ошибки связаны с dplyr::nth()
и соответствующими функциями.И я обнаружил некоторые старые проблемы, связанные с этим поведением, но они больше не должны существовать https://github.com/tidyverse/dplyr/issues/1980 Я был бы очень признателен, если бы кто-то смог осветить, в чем проблема, и как сделать это аккуратно.