如何从数据框的列中删除与字符串模式不匹配的字符
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.
我的数据框中有一列,如下所示。
我想将数据保留在模式“\\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.