Как использовать определение строки с case_when? - PullRequest
1 голос
/ 24 апреля 2020

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

library(dplyr)
library(stringr)

  df<-data.frame(charge=c("trespass-1st degree",
      "trespass - 1st degree","rape or attempted rape - 1st degree",
      "rape or attempt rape 1st degree","Assault 1st","Assault 1st"))

                               charge
1                 trespass-1st degree
2               trespass - 1st degree
3 rape or attempted rape - 1st degree
4     rape or attempt rape 1st degree
5                         Assault 1st
6                         Assault 1st

Я хочу убедиться, что определенные сборы, которые имеют ошибки ввода данных, стандартизированы. например, trespass-1st degree против trespass - 1st degree и rape or attempted rape - 1st degree против rape or attempt rape 1st degree

Я попробовал следующее

df%>%
  mutate(charge=
           case_when(str_detect(charge, "^trespass-1st") ~ "Trespass 1st",
                     str_detect(charge,"^rape or attempted rape")~"Rape 1st"))

, которое дает мне следующий вывод

        charge
1 Trespass 1st
2         <NA>
3     Rape 1st
4         <NA>
5         <NA>
6         <NA>

Как мне убедиться, что если присутствуют только две строки, такие как «tresspass» и «1st», то это будет помечено как «Trespass 1st», а если «rape» и «1st» присутствует в столбце «Заряд», то это будет помечено как « Rape 1st "

Для получения следующего df

        charge
1 Trespass 1st
2 Trespass 1st        
3     Rape 1st
4     Rape 1st
5  Assault 1st
6  Assault 1st

1 Ответ

1 голос
/ 24 апреля 2020

Проблема в том, что некоторые элементы не имеют пробелов (trespass-1st против trespass-1st) или суффикса (attempt против attempted)

library(dplyr)
df %>%
    mutate(charge=
         case_when(str_detect(charge, "^trespass\\s*-\\s*1st") ~ 
           "Trespass 1st",
                  str_detect(charge,"^rape or attempte*d* rape")~"Rape 1st", 
              TRUE ~ charge))
#        charge
#1 Trespass 1st
#2 Trespass 1st
#3     Rape 1st
#4     Rape 1st
#5  Assault 1st
#6  Assault 1st

data

df <- structure(list(charge = c("trespass-1st degree", "trespass - 1st degree", 
"rape or attempted rape - 1st degree", "rape or attempt rape 1st degree", 
"Assault 1st", "Assault 1st")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
...