更改R中已过滤的data.frame中一列中的所有值

时间:2018-12-21 11:10:54

标签: r dplyr stringr

我的数据框架非常混乱,其中一列的值是人类可以理解的,但计算机却无法理解,有点像下面的内容。

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"))

我可以用str_detect过滤df

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 :(得分:3)

以下是用于预处理数据的两种解决方案,一种已经在注释中给出:

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

答案 1 :(得分:3)

您可以使用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

答案 2 :(得分:2)

如果您只想重命名所有过滤的结果,怎么办:

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"