Вот как я определил свое условие, но мне также нужна строка чуть выше. На каждый идентификатор приходится много наблюдений.
data2<- data2 %>%
group_by (ID_number) %>%
filter(time_diff_hour > 8.000 | is.na(time_diff_hour))
Вам будет легче помочь, если вы включите простой воспроизводимый пример с примерами ввода и желаемым результатом, который можно использовать для тестирования и проверки возможных решений.
Я думаю, вам нужен либо idx = which(ave(data$time_diff_hour, data$id, FUN = \(x) x>8L | is.na(x))==1L); data[sort(unique(c(idx, idx-1L))), ] |> `rownames<-`(NULL)
, либо by(data, ~id, \(X) { idx = which(X$time_diff_hour>8L | is.na(X$time_diff_hour)) ; X[sort(unique(c(idx, idx-1L))), ] }) |> array2DF() |> _[-1L] |> `rownames<-`(NULL)
.
Для таких данных, как data = structure(list(id = c(1L, 1L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L), time_diff_hour = c(NA, 9, NA, 3, 8, 4, 2, 9, 10, NA)), row.names = c(7L, 9L, 5L, 1L, 3L, 8L, 10L, 2L, 4L, 6L), class = "data.frame")
Вы можете добавить условия фильтра с помощью функции lead
, которая вернет строку над тестируемой строкой. И наоборот, если вам нужно вернуть строку ниже тестируемой, вы можете использовать функцию lag
.
data2<- data2 %>%
group_by (ID_number) %>%
filter(time_diff_hour > 8.000 | is.na(time_diff_hour) |
lead(time_diff_hour) > 8.000 | is.na(lead(time_diff_hour)))
Вот решение в базе R:
# Generate a sample data frame
data2 <- data.frame(ID_number = rep(factor(sample(1000:9999, 10, replace=TRUE)), 4),
time_diff_hour = sample(c(NA, 4:12), 40, replace=TRUE))
# Find indices matching the criteria
i <- which(data2$time_diff_hour > 8 | is.na(data2$time_diff_hour)) # initial matches
i <- sort(unique(c(i, i-1))) # combine initial matches with previous rows
i <- i[i %in% seq_along(data2$time_diff_hour)] # to ensure only valid indices are used (i.e. for case where a match is generated in row #1)
data2[i, ]
Я понимаю, что это довольно неуклюже (если это можно упростить/сократить, дайте мне знать!) – одна из причин, почему у нас есть dplyr/tidyverse...
Вам не нужно кричать на нас. Пожалуйста, спокойно прочитайте , как предоставить воспроизводимый пример , и отредактируйте свой вопрос, чтобы включить его.