我的数据框架非常混乱,其中一列的值是人类可以理解的,但计算机却无法理解,有点像下面的内容。
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
答案 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"