Создание индексной / цифровой последовательности для последующего N / As во фрейме данных - PullRequest
3 голосов
/ 18 апреля 2019

У меня есть столбец во фрейме данных (здесь он называется «а»), где начало последовательности помечено 1, а последующие инциденты, принадлежащие к той же последовательности, помечены N / A.Теперь я хотел бы создать новый столбец («b») для индексации всех инцидентов, принадлежащих к той же последовательности (1: n), а затем создать третий столбец («c») с номерами, указывающими, какие инциденты принадлежат к той же последовательности.

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

Обычно я использую dplyr (мне также нужно сделать несколько group_by с моими данными, что на самом деле более сложно, чем я здесь изложил), поэтому я был бы очень рад решению dplyr, если это возможно!

Пример кода для начала:

df <- data.frame("a"= c(1, NA, NA, NA, 1, NA, 1, 1, 1))

Как это должно выглядеть в конце:

df_final <- data.frame("a"= c(1, NA, NA, NA, 1, NA, 1, 1, 1), "b"= c(1, 2, 3, 4, 1, 2, 1, 1, 1), "c" = c(1, 1, 1, 1, 2, 2, 3, 4, 5))

1 Ответ

1 голос
/ 18 апреля 2019

РЕДАКТИРОВАТЬ

Поскольку теперь вопрос изменился, получить ожидаемый результат теперь проще

library(dplyr)
df %>%
  group_by(c = cumsum(!is.na(a))) %>%
  mutate(b = row_number())

#     a     c     b
#  <dbl> <int> <int>
#1     1     1     1
#2    NA     1     2
#3    NA     1     3
#4    NA     1     4
#5     1     2     1
#6    NA     2     2
#7     1     3     1
#8     1     4     1
#9     1     5     1

И с использованием базы R это будет:

df$c <- cumsum(!is.na(df$a))
df$b <- with(df, ave(a, c, FUN  = seq_along))

Оригинальный ответ

К сожалению, группировка для создания b и c отличается.Для b мы group_by получаем последовательные значения, отличные от NA, и накапливаем их, а затем генерируем row_number для каждой группы.Для c мы берем rle для значений, отличных от NA, и rep едим группу values lengths раз.

library(dplyr)

df %>%
  group_by(group = cumsum(!is.na(a))) %>%
  mutate(b = row_number()) %>%
  ungroup() %>%
  select(-group) %>%
  mutate(c = with(rle(!is.na(a)), rep(cumsum(values), lengths)))

# A tibble: 9 x 3
#      a     b     c
#   <dbl> <int> <int>
#1     1     1     1
#2    NA     2     1
#3    NA     3     1
#4    NA     4     1
#5     1     1     2
#6    NA     2     2
#7     1     1     3
#8     1     1     3
#9     1     1     3

Конечно, это не dplyr конкретный ответ, и на него также можно ответить с помощью базы R

df$b <- with(df, ave(a, cumsum(!is.na(a)), FUN  = seq_along))
df$c <- with(df, with(rle(!is.na(a)), rep(cumsum(values), lengths)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...