Создание уникальных групп по строкам на основе логического вектора в data.frame - PullRequest
0 голосов
/ 24 сентября 2018

Я думаю, что для этого должно быть решение на SO, но я искал решения с почти , что я хочу, но не совсем. Если возможно, ищите решение по тививеру.

У меня есть data.frame, скажем, newdf:

newdf <- data.frame(inside.city = c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE))

newdf
  inside.city
1        TRUE
2        TRUE
3        TRUE
4       FALSE
5       FALSE
6        TRUE
7       FALSE
8       FALSE

Каждый раз, когда кто-то "покидает город" (внутри.city == FALSE), я хочу присвоить их поездке уникальный номер группы, чтобы результирующий кадр data.frame выглядел следующим образом:

  inside.city group
1        TRUE    NA
2        TRUE    NA
3        TRUE    NA
4       FALSE     1
5       FALSE     1
6        TRUE    NA
7       FALSE     2
8       FALSE     2

Предположим, что данные уже упорядочены по дате.

Как я могу сделать это эффективно?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Другое решение с использованием dplyr и data.table:

df %>%
  mutate(group = ifelse(inside.city == FALSE, rleid(inside.city), NA),
         group = dense_rank(group))
0 голосов
/ 24 сентября 2018

Вот способ использования mutate().Я просто дважды преобразовываю столбец, чтобы упростить вещи

library(dplyr)
newdf %>% mutate(group=cumsum(!inside.city & lag(inside.city, default=TRUE)), 
                 group=ifelse(inside.city, NA, group)) 

В основном вы просто увеличиваете, когда видите FALSE после TRUE, а затем устанавливаете значения TRUE в NA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...