Идентификация позиций последних ИСТИН в последовательности ИСТИНА и ЛОЖЬ

У меня есть вектор ИСТИН и ЛОЖЬ:

x <- c(F,F,F,T,T,T,F,F,F,T,T,T,F,T,T)

Я хотел бы элегантно (и в базе) определить позицию последнего TRUE, прежде чем он изменится на FALSE.

Однако следующие работы, похоже, можно упростить:

c((x[-1] != x[-length(x)]),T) & x
> FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

Вход и выход: Идентификация позиций последних ИСТИН в последовательности ИСТИНА и ЛОЖЬ

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
620
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Проверьте rle

rlex = rle(x)
end = cumsum(rlex$lengths)
x&(seq(length(x)) %in% end)
[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

Другой макет, предложенный Фрэнком

seq_along(x) %in% with(rle(x), cumsum(lengths)[values])
[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

Не-base решение для определения последнего TRUE перед FALSE.

 library(dplyr)

 y <- data.frame(x = c(FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,
 FALSE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE))

 y %>% 
   mutate(lasttrue = case_when(x == TRUE & lead(x) == FALSE ~ TRUE,
                               TRUE ~ FALSE))

Редактировать:

y %>% 
  mutate(lasttrue = case_when(x > lead(x) ~ T,
                              T ~ F)) 

Возвращает неправильный результат с двумя последними элементами: FALSE, TRUE.

Khaynes 29.06.2019 23:02

Еще одна версия с rle

x[setdiff(seq_along(x), with(rle(x), cumsum(lengths) * values))] <- FALSE
x
#[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

Воспользуйтесь преимуществами diff с добавленным FALSE, чтобы уловить подразумеваемый TRUE-to-FALSE в конце.

diff(c(x,FALSE)) == -1
# [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
#[13] FALSE FALSE  TRUE

Больше гольфа diff(c(x,0))<0.

jay.sf 29.06.2019 08:37
Ответ принят как подходящий

Мы можем посмотреть, где x больше, чем сдвинутое x с добавленным 0.

x>c(x[-1],0)
# [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

Вариант с duplicated

library(data.table)
!duplicated(rleid(x), fromLast = TRUE) & x
#[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

ориентиры

Спасибо за все решения. Если кому интересны тесты:

library(dplyr)
library(data.table)

set.seed(1)
x <- sample(c(TRUE, FALSE), 1000000, replace = T)
y <- data.frame(x = x) # For M. Viking's solution
x_dt <- x # For Ronak Shah's solution

microbenchmark::microbenchmark(Khaynes = {Khaynes <- c((x[-1] != x[-length(x)]),T) & x},
                                jay.sf = {jay.sf <- x>c(x[-1],0)},
                                jay.sf_2 = {jay.sf_2 <- diff(c(x,0))<0},
                                thelatemail = {thelatemail <- diff(c(x,FALSE)) == -1}, 
                                WeNYoBen = {rlex = rle(x); end = cumsum(rlex$lengths); WeNYoBen <- x&(seq(length(x)) %in% end)}, 
                                M._Viking = {M._Viking <- y %>% mutate(lasttrue = case_when(x > lead(x) ~ T, T ~ F))}, 
                                akrun = {akrun <- !duplicated(rleid(x), fromLast = TRUE) & x},
                                frank = {frank <- seq_along(x) %in% with(rle(x), cumsum(lengths)[values])}, 
                                Ronak_Shah = {x_dt[setdiff(seq_along(x_dt), with(rle(x_dt), cumsum(lengths) * values))] <- FALSE},
                                times = 50)
# Output:
    # Unit: milliseconds
    #         expr      min       lq      mean    median       uq      max neval
    #      Khaynes  23.0283  26.5010  31.76180  31.71290  37.1449  46.3824    50
    #       jay.sf  13.0630  13.5373  17.84056  13.77135  20.5462  73.5926    50
    #     jay.sf_2  26.1960  27.7653  35.25296  36.39615  39.3686  61.8858    50
    #  thelatemail  24.8204  26.7178  32.51675  33.50165  36.6328  41.9279    50
    #     WeNYoBen  83.9070  98.4700 107.79965 101.88475 107.1933 170.2940    50
    #    M._Viking  73.5963  83.4467  93.99603  86.58535  94.0915 151.7075    50
    #        akrun  42.5265  43.2879  48.42697  44.98085  51.1533 105.2836    50
    #        frank  81.9115  90.1559  95.40261  93.97015  98.2921 129.6162    50
    #   Ronak_Shah 109.0678 121.8230 133.10690 125.63930 133.7222 231.5350    50

all.equal(Khaynes, jay.sf)
all.equal(Khaynes, jay.sf_2)
all.equal(Khaynes, thelatemail)
all.equal(Khaynes, WeNYoBen)
all.equal(Khaynes, M._Viking$lasttrue) # When the last element is TRUE it will return false.
all.equal(Khaynes, akrun)
all.equal(Khaynes, frank)
all.equal(Khaynes, x_dt) # Ronak Shah solution.

Хорошее продолжение. x>c(x[-1],0) @jay.sf — победитель.

M.Viking 30.06.2019 02:34

Другие вопросы по теме