搜索字符串
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 4 课,共 64 课。
grepl(pattern, x) 会为 x 中每个包含 pattern 的元素返回 TRUE。添加 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 结尾。不区分大小写:对于域名 coddy.tech,CY@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")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器