Как сгруппировать значения на основе NA и алфавита - PullRequest
2 голосов
/ 03 августа 2020

У меня есть столбец LETTER значений в алфавитном порядке c порядок в кадре данных, частично перемежающийся с NA:

df1 <- data.frame(
  phase = c(NA, "A", "B", "D", NA, "A", "B", "C", "E", "A", "B", "D")
)

Значения LETTER формируют группы: все, начиная с A пока или следующий NA или следующий A не станет группой. Я хотел бы создать новый столбец, чтобы сделать эти группы явными.

Ожидаемый результат:

df1 <- data.frame(
  phase = c(NA, "A", "B", "D", NA, "A", "B", "C", "E", "A", "B", "D"),
  group = c(NA,"group1","group1","group1",NA, "group2","group2","group2","group2","group3","group3","group3")
)

Как я могу создать этот столбец? Я благодарен за любой совет, основанный на dplyr или нет.

То, что я пробовал до сих пор, - с частичным успехом (третья группа, которая не отделена от второй NA, отсутствует):

df1 %>% 
  mutate(group = cumsum(is.na(phase)),
         group = ifelse(is.na(phase), NA, paste("group", group, sep = "")))

   phase  group
1   <NA>   <NA>
2      A group1
3      B group1
4      D group1
5   <NA>   <NA>
6      A group2
7      B group2
8      C group2
9      E group2
10     A group2
11     B group2
12     D group2

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Если фаза "A", перейти к следующей группе. Затем замените эти группы на NA, когда phase равно NA.

library(dplyr)

df1 %>%
  mutate(group = cumsum(phase == "A" & !is.na(phase)) %>%
                 paste0("group", .) %>% 
                 replace(is.na(phase), NA))

#    phase  group
# 1   <NA>   <NA>
# 2      A group1
# 3      B group1
# 4      D group1
# 5   <NA>   <NA>
# 6      A group2
# 7      B group2
# 8      C group2
# 9      E group2
# 10     A group3
# 11     B group3
# 12     D group3
1 голос
/ 03 августа 2020

Мы также можем сделать

library(dplyr)
library(stringr)
df1 %>% 
   mutate(group = str_c('group', cumsum(phase %in% 'A') * NA^is.na(phase)))
#  phase  group
#1   <NA>   <NA>
#2      A group1
#3      B group1
#4      D group1
#5   <NA>   <NA>
#6      A group2
#7      B group2
#8      C group2
#9      E group2
#10     A group3
#11     B group3
#12     D group3
...