изменение всех значений в одном столбце в отфильтрованном data.frame в R - PullRequest
0 голосов
/ 21 декабря 2018

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

df<-data.frame("id"=c(1:10), 
           "colour"=c("re d", ", red", "re-d","green", "gre, en", ", gre-en",  "blu e", "green", ", blue", "bl ue"))

Я могу отфильтровать df с помощью str_detect

df %>% filter(str_detect(tolower(colour), pattern = "gr")) 

Но я хочу переименовать все отфильтрованные результаты в одно и то же значение, чтобы я мог их обрезать.
Любойпредложения?
Я пытался расстаться с шаблоном, но безуспешно.

РЕДАКТИРОВАТЬ: Не все.и пробелы не нужны в df, с которым я работаю.Допустим, правильный способ написания зелёного в готовом df - «gr. Een».

EDIT2:
Требуется результат с имитацией правописания цветов, просто чтобы получить представление:

id     colour
1      r. ed
2      r. ed
3      r. ed
4      gr. een
6      gr. een
7      gr. een
8      blu. e
9      gr. een           
10     blu. e

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Вот два решения для предварительной обработки ваших данных, одно уже дано в комментариях:

library(dplyr)
df %>% 
  mutate(colour2 = gsub("[^A-z]", "", colour))%>%
  filter(str_detect(tolower(colour2), pattern = "green")) 

Делая обратное мышление, вы можете использовать stringr для извлечения букв

library(stringr)

df %>% 
  mutate(colour2 = sapply(str_extract_all(df$colour,"[A-z]"),function(vec){paste0(vec,collapse = "")}))%>%
  filter(str_detect(tolower(colour2), pattern = "green")) 

Ваш выбор будет более надежным, а столбец уже переименован.

  id   colour colour2
1  4    green   green
2  5  gre, en   green
3  6 , gre-en   green
4  8    green   green
0 голосов
/ 21 декабря 2018

Вы можете использовать mgsub для замены нескольких слов несколькими шаблонами:

df<-data.frame("id"=c(1:10), 
               "colour"=c("re d", ", red", "re-d","green", "gre, en", 
                          ", gre-en",  "blu e", "green", ", blue", "bl ue"))

library(textclean)

df$colour = mgsub(df$colour, 
                  pattern =  c(".*gr.*", ".*re.*", ".*bl.*"), 
                  replacement =  c("gr. een", "r. ed", "blu. e"), fixed = F)

df

#     id  colour
# 1   1   r. ed
# 2   2   r. ed
# 3   3   r. ed
# 4   4 gr. een
# 5   5 gr. een
# 6   6 gr. een
# 7   7  blu. e
# 8   8 gr. een
# 9   9  blu. e
# 10 10  blu. e
0 голосов
/ 21 декабря 2018

Если вы просто хотите переименовать все отфильтрованные результаты, как о:

df<-data.frame("id"=c(1:10), 
               "colour"=c("re d", ", red", "re-d","green", "gre, en", ", gre-en",  "blu e", "green", ", blue", "bl ue"))

library(stringr)                                                         
df[str_detect(tolower(df[,"colour"]), pattern = "gr"), "colour"] <- "green"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...