Случай dplyr, когда: затронут только 1-й экземпляр - PullRequest
1 голос
/ 11 марта 2019

У меня есть фрейм данных, в котором я хочу изменить некоторые значения в одном из столбцов.

Значения столбца выглядят так:

[1] «мягкие кораллы», «мягкие кораллы», «мягкие кораллы», «мягкие кораллы», «мягкие кораллы», «мягкие кораллы», «мягкие кораллы». [8] "мягкие кораллы" "мягкие кораллы" "..5" "..5" "..5" "..5" "..5"
[15] "..5" "..5" "..5" "..5" "..6" "..6" "..6"
[22] "..6" "..6" "..6" "..6" "..6" "..6" "..7"
[29] "..7" "..7" "..7" "..7" "..7" "..7" "..7"
[36] "..7" "..8" "..8" "..8" "..8" "..8" "..8"
[43] "..8" "..8" "..8" "..9" "..9" "..9" "..9"
[50] "..9" "..9" "..9" "..9" "..9" "..10" "..10"
[57] "..10" "..10" "..10" "..10" "..10" "..10" "..10"
[64] "..11" "..11" "..11" "..11" "..11" "..11" "..11"
[71] "..11" "..11" "морские болельщики" "морские болельщики" "морские болельщики" "морские болельщики" "морские болельщики"
[78] "морские фанаты" "морские фанаты" "морские фанаты" "морские фанаты" "..13" "..13" "..13"
[85] "..13" "..13" "..13" "..13" "..13" "..13" "..14"
[92] "..14" "..14" "..14" "..14" "..14" "..14" "..14"
[99] "..14"

Я хочу заменить числа на предыдущее значение, скажем, «мягкие кораллы» или «морские веера» в зависимости от положения

Мой код выглядит следующим образом (ах - это фрейм данных obj, cor_type - это имя столбца):

ah <- ah %>% mutate(cor_n = case_when(stringi::stri_detect(str = cor_type, regex = "\\.") ~lag(cor_type),
                                     TRUE ~ cor_type
            )
          )

Это, однако, изменяет только первый экземпляр соответствия регулярному выражению, то есть в 9-й строке. Остальные значения остаются прежними. Наверное, я ошибаюсь в своем предположении о том, как mutate работает? PS: я не хочу писать цикл for

1 Ответ

3 голосов
/ 11 марта 2019

Я не думаю, что case_when - лучший выбор здесь. Одним из способов было бы replace значения с шаблоном (\\.) до NA и затем fill NA с предыдущим значением, отличным от NA.

library(tidyverse)

ah %>%
  mutate(cor_type = replace(cor_type, str_detect(cor_type, "\\."), NA)) %>%
  fill(cor_type)

#    a    cor_type
#1   1 soft corals
#2   2 soft corals
#3   3 soft corals
#4   4 soft corals
#5   5 soft corals
#6   6 soft corals
#7   7    sea fans
#8   8    sea fans
#9   9    sea fans
#10 10    sea fans

данные

Создан небольшой воспроизводимый пример для работы.

ah <- data.frame(a = 1:10, cor_type = c("soft corals", "soft corals",
      "..5", "..5", "..5","..6", "sea fans", "sea fans", "..13", "..14" ))

ah
#    a    cor_type
#1   1 soft corals
#2   2 soft corals
#3   3         ..5
#4   4         ..5
#5   5         ..5
#6   6         ..6
#7   7    sea fans
#8   8    sea fans
#9   9        ..13
#10 10        ..14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...