如何从数据框的列中删除与字符串模式不匹配的字符

How to Remove characters that doesn't match the string pattern from a column of a data frame

我的数据框中有一列,如下所示。

我想将数据保留在模式“\\d+Zimmer”中,并将图中的“9586”和“927”等列中的所有数字删除。 我尝试了以下 gsub 函数。

gsub("[^\d+Zimmer]", "", flat_cl_one$rooms) 

但是它删除了所有数字,如下所示。

我可以使用什么正则表达式来获得正确的结果?提前致谢

我们可以将任何包含字母数字字符的行强制转换为 NA,然后将没有 NA 的行替换为空白。

library(dplyr)

flat_cl_one %>% 
  mutate(rooms = ifelse(!is.na(as.numeric(rooms)), "", rooms))

或者我们可以使用str_detect:

flat_cl_one %>% 
  mutate(rooms = ifelse(str_detect(rooms, "Zimmer", negate = TRUE), "", rooms))

输出

        rooms
1   647Zimmer
2   394Zimmer
3            
4            
5 38210Zimmer

如果您想真正删除这些行,我们可以对 filter 做同样的事情。

flat_cl_one %>% 
  filter(is.na(as.numeric(rooms)))

#        rooms
#1   647Zimmer
#2   394Zimmer
#3 38210Zimmer

数据

flat_cl_one <- structure(list(rooms = c("647Zimmer", "394Zimmer", "8796", "9389", 
"38210Zimmer")), class = "data.frame", row.names = c(NA, -5L))

只需替换不包含单词“Zimmer”的字符串

flat_cl_one$room[!grepl("Zimmer", flat_cl_one$room)] <- ""

flat_cl_one
#>       room
#> 1  3Zimmer
#> 2  2Zimmer
#> 3  2Zimmer
#> 4  3Zimmer
#> 5         
#> 6         
#> 7  3Zimmer
#> 8  6Zimmer
#> 9  2Zimmer
#> 10 4Zimmer

数据

flat_cl_one <- data.frame(room = c("3Zimmer", "2Zimmer", "2Zimmer", "3Zimmer", 
                                   "9586", "927", "3Zimmer", "6Zimmer", 
                                   "2Zimmer", "4Zimmer"))

另一种可能的解决方案,使用stringr::str_extract(我正在使用@AndrewGillreath-Brown的数据,我感谢他):

library(tidyverse)

df <- structure(
  list(rooms = c("647Zimmer", "394Zimmer", "8796", "9389", "38210Zimmer")),
  class = "data.frame", 
  row.names = c(NA, -5L))

df %>% 
  mutate(rooms = str_extract(rooms, "\d+Zimmer"))

#>         rooms
#> 1   647Zimmer
#> 2   394Zimmer
#> 3        <NA>
#> 4        <NA>
#> 5 38210Zimmer

此模式 [^\d+Zimmer] 匹配除数字或以下字符之外的任何字符 + Z i m 等...

使用 gsub,您可以使用否定先行 (?! 设置 perl = TRUE 检查字符串是否不以模式 ^\d+Zimmer 开头,然后如果断言匹配 1 个或多个数字是真的。

gsub("^(?!^\d+Zimmer\b)\d+\b", "", flat_cl_one$rooms, perl = TRUE)

看到 R demo.