Ближайший индекс логического вектора в R - PullRequest
2 голосов
/ 18 февраля 2020

Я пытаюсь получить индекс ближайшего ИСТИННОГО значения из столбца на основе записи другого столбца. Мой примерный фрейм данных выглядит следующим образом:

a <- c(FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE)
b <- c(NA, NA, 3, NA, NA, NA, NA, 8, NA, NA, NA, 12, NA, NA, NA)
df <- data.frame(a, b)

Я хотел бы создать новый столбец, в котором будет указан индекс ближайшего ИСТИННОГО значения перед заданным значением из b. Чтобы проиллюстрировать, полученный df должен выглядеть следующим образом:

       a  b  c
1  FALSE NA NA
2   TRUE NA NA
3  FALSE  3  2
4  FALSE NA NA
5  FALSE NA NA
6   TRUE NA NA
7  FALSE NA NA
8  FALSE  8  6
9   TRUE NA NA
10  TRUE NA NA
11 FALSE NA NA
12 FALSE 12 10
13 FALSE NA NA
14 FALSE NA NA
15 FALSE NA NA

Я знаю, что могу использовать max(which(df$a == TRUE)), но я не знаю, как заставить его работать таким образом, чтобы он учитывал только индекс предыдущих значений. Спасибо!

1 Ответ

2 голосов
/ 18 февраля 2020

Мы можем получить индекс всех TRUE значений и затем использовать findInterval, чтобы получить ближайший для каждого значения в b.

inds <- which(df$a)
df$c <- inds[findInterval(df$b, inds)]
df

#       a  b  c
#1  FALSE NA NA
#2   TRUE NA NA
#3  FALSE  3  2
#4  FALSE NA NA
#5  FALSE NA NA
#6   TRUE NA NA
#7  FALSE NA NA
#8  FALSE  8  6
#9   TRUE NA NA
#10  TRUE NA NA
#11 FALSE NA NA
#12 FALSE 12 10
#13 FALSE NA NA
#14 FALSE NA NA
#15 FALSE NA NA
...