использование dplyr case_when для изменения значений NA на основе значения из другого столбца - PullRequest
0 голосов
/ 15 марта 2019
structure(list(a = c(NA, 3, 4, NA, 3, "Council" , "Council", 1), b = c("Council A", 3, 4, 
"Council B", 6, 7, 2, 6), c = c(6, 3, 6, 5, 3, 6, 5, 3), d = c(6, 2, 4, 
5, 3, 7, 2, 6), e = c(1, 2, 4, 5, 6, 7, 6, 3), f = c(2, 3, 4, 
2, 2, 7, 5, 2)), .Names = c("a", "b", "c", "d", "e", "f"), row.names = c(NA, 
8L), class = "data.frame")

Я пытаюсь преобразовать объекты в a, используя dplyr mutuate и case_when, основываясь на тексте в b.Я хочу преобразовать значения в a в Совет, если b содержит Совет в строке.

Я использовал код DF %>% select(a, b) %>% mutate(a =case_when(grepl("Council", b) ~"Council"))

Однако все значения становятся NA в, если они не содержат строку Council.Я просмотрел другие посты и попробовал различные методы, включая ifelse.Я хочу сохранить тот же самый фрейм данных, просто сделайте любые NA значения в конвертируемых в Совет, но только в тех случаях, когда это NA значения.

Ответы [ 2 ]

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

С ?case_when

Если не найдено ни одного случая, возвращается NA.

Так что для случаев, когда в «1008» нет слова «Совет», возвращается NA.

Вам необходимо определить аргумент TRUE в case_when и присвоить его a, чтобы сохранить значения без изменений, когда условие не выполняется.

library(dplyr)

df %>%  
 mutate(a = case_when(grepl("Council", b) ~"Council",
                        TRUE ~ a))


#        a         b c d e f
#1 Council Council A 6 6 1 2
#2       3         3 3 2 2 3
#3       4         4 6 4 4 4
#4 Council Council B 5 5 5 2
#5       3         6 3 3 6 2
#6 Council         7 6 7 7 7
#7 Council         2 5 2 6 5
#8       1         6 3 6 3 2

В этом случае вы также можете достичь своего результата, используя базу R

df$a[grepl("Council", df$b)] <- "Council"
0 голосов
/ 18 марта 2019

Вы также можете использовать str_detect из пакета stringr для достижения своей цели.

library(dplyr)
library(stringr)

df <- structure(list(a = c(NA, 3, 4, NA, 3, "Council" , "Council", 1), b = c("Council A", 3, 4, 
                                                                   "Council B", 6, 7, 2, 6), c = c(6, 3, 6, 5, 3, 6, 5, 3), d = c(6, 2, 4, 
                                                                                                                                  5, 3, 7, 2, 6), e = c(1, 2, 4, 5, 6, 7, 6, 3), f = c(2, 3, 4, 
                                                                                                                                                                                       2, 2, 7, 5, 2)), .Names = c("a", "b", "c", "d", "e", "f"), row.names = c(NA, 
                                                                                                                                                                                                                                                                8L), class = "data.frame")

df %>% 
  mutate(a=ifelse(str_detect(b,fixed("council",ignore_case = T)) & is.na(a),"Council",a))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...