У меня есть столбец в моем фрейме данных, как показано ниже.
Я хочу сохранить данные в шаблоне «\\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, вы можете проверить, не начинается ли строка с шаблона ^\\d+Zimmer
, используя настройку отрицательного просмотра (?!
perl = TRUE
, а затем сопоставить 1 или более цифр, если утверждение верно.
gsub("^(?!^\\d+Zimmer\\b)\\d+\\b", "", flat_cl_one$rooms, perl = TRUE)
См. демонстрация R.
Спасибо, это почти решает мою проблему. Мне нужно сохранить строки и в этом шаблоне, например: «3,5 — 4,5Zimmer». Когда я запускаю приведенный выше код, я теряю эту часть "3.5"
@manojrasika В этом случае шаблон может быть ^(?!^\\d+(?:\\s*-\\s*\\d+)?Zimmer\\b)\\d+
Смотрите это демо
Вы хотите удалить строки, удалить первые цифры, и то, и другое или что-то еще?