Поиск в строках
Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 4 из 64.
grepl(pattern, x) возвращает TRUE для каждого элемента x, который содержит pattern. Добавьте fixed = TRUE, чтобы искать точное совпадение символов. Без этого pattern является регулярным выражением, в котором такие символы, как . и ?, имеют особое значение.
files <- c("report.csv", "photo.png", "data.csv")
print(grepl(".csv", files, fixed = TRUE))
print(files[grepl(".csv", files, fixed = TRUE)])Вывод:
[1] TRUE FALSE TRUE
[1] "report.csv" "data.csv" startsWith(x, prefix) и endsWith(x, suffix) проверяют только начало или конец каждой строки. Все эти поисковые операции чувствительны к регистру, поэтому сначала преобразуйте строки с помощью tolower(), чтобы игнорировать регистр.
names <- c("Anna", "bob", "Andre")
print(startsWith(names, "An"))
print(startsWith(tolower(names), "b"))Вывод:
[1] TRUE FALSE TRUE
[1] FALSE TRUE FALSEРезультаты являются логическими векторами, поэтому sum() подсчитывает совпадения, а any() проверяет наличие хотя бы одного:
emails <- c("a@x.com", "bad-address", "c@y.org")
valid <- grepl("@", emails, fixed = TRUE)
print(sum(valid))
print(any(!valid))Вывод:
[1] 2
[1] TRUEgrep(pattern, x) возвращает позиции совпадающих элементов, а grep(pattern, x, value = TRUE) — сами элементы:
files <- c("a.csv", "b.txt", "c.csv")
print(grep(".csv", files, fixed = TRUE))
print(grep(".csv", files, fixed = TRUE, value = TRUE))Результат:
[1] 1 3
[1] "a.csv" "c.csv"Задание
ЛегкоРеализуйте count_domain(emails, domain). Верните количество адресов в emails, которые заканчиваются на @, за которым следует domain. Без учёта регистра: CY@CODDY.TECH засчитывается для домена coddy.tech.
Предоставленный код считывает адреса в виде строки, разделённой запятыми, затем домен и выводит возвращённое число.
Попробуйте сами
count_domain <- function(emails, domain) {
# Напишите ваш код здесь
0
}
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
emails <- strsplit(input[1], ",")[[1]]
cat(count_domain(emails, input[2]), sep = "\n")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки углублённо
Подстроки с substr()Форматирование с sprintf()Разделение и объединениеПоиск в строкахЗамена текстаПовторение — создание имени пользователя4Матрицы
Создание матрицИндексация матрицСводные данные по строкам и столбцамАрифметика матрицПовторение — схема рассадки7Семейство Apply
lapply и sapplyMap и mapplyFilter и FindReduceПовторение — конвейер обработки данных10Продвинутые конструкции управления
Функция switch()Векторизованный ifelse()repeat и breakРекурсивные функцииПовторение — классификатор оценок2Поиск по ключам и значениям
Поиск в именованных векторахПроверка ключейДобавление и удаление ключейПеребор имёнПовторение — биржа акций5Проект — Журнал оценок
Добавление учениковВыставление оценок3Множества и подсчёт
Уникальные значенияОперации с множествамиПроверка принадлежностиПодсчёт с помощью table()Повторение — гости мероприятия6Функции как значения
Анонимные функцииПередача функцийВозврат функцийЗамыкания с состояниемПовторение — правила скидок9Таблицы данных
Создание таблиц данныхСтолбцы и строкиФильтрация строкДобавление и сортировкаПовторение — отчёт о продажах12Проект — Трекер расходов
Запись расходовОбщие расходыПотренируйтесь самостоятельно: Онлайн-компилятор R