Tìm kiếm trong chuỗi
Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 4 trên 64.
grepl(pattern, x) trả về TRUE cho mỗi phần tử trong x có chứa pattern. Thêm fixed = TRUE để tìm chính xác các ký tự. Nếu không có tham số này, mẫu sẽ được xem là biểu thức chính quy, trong đó các ký tự như . và ? có ý nghĩa đặc biệt.
files <- c("report.csv", "photo.png", "data.csv")
print(grepl(".csv", files, fixed = TRUE))
print(files[grepl(".csv", files, fixed = TRUE)])Đầu ra:
[1] TRUE FALSE TRUE
[1] "report.csv" "data.csv" startsWith(x, prefix) và endsWith(x, suffix) chỉ kiểm tra phần đầu hoặc phần cuối của mỗi chuỗi. Tất cả các phép tìm kiếm này đều phân biệt chữ hoa chữ thường, vì vậy hãy chuyển đổi bằng tolower() trước để bỏ qua kiểu chữ.
names <- c("Anna", "bob", "Andre")
print(startsWith(names, "An"))
print(startsWith(tolower(names), "b"))Đầu ra:
[1] TRUE FALSE TRUE
[1] FALSE TRUE FALSEKết quả là các véc-tơ logic, vì vậy sum() đếm số kết quả khớp và any() kiểm tra xem có ít nhất một kết quả hay không:
emails <- c("a@x.com", "bad-address", "c@y.org")
valid <- grepl("@", emails, fixed = TRUE)
print(sum(valid))
print(any(!valid))Đầu ra:
[1] 2
[1] TRUEgrep(pattern, x) trả về vị trí của các phần tử khớp với mẫu, còn grep(pattern, x, value = TRUE) trả về chính các phần tử đó:
files <- c("a.csv", "b.txt", "c.csv")
print(grep(".csv", files, fixed = TRUE))
print(grep(".csv", files, fixed = TRUE, value = TRUE))Đầu ra:
[1] 1 3
[1] "a.csv" "c.csv"Thử thách
DễHoàn thiện count_domain(emails, domain). Trả về số lượng địa chỉ trong emails kết thúc bằng @ theo sau là domain. Không phân biệt chữ hoa chữ thường: CY@CODDY.TECH được tính cho miền coddy.tech.
Đoạn code được cung cấp đọc các địa chỉ từ một dòng, trong đó các địa chỉ được phân tách bằng dấu phẩy, sau đó đọc miền và in ra số được trả về.
Tự làm thử
count_domain <- function(emails, domain) {
# Viết code của bạn ở đây
0
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
emails <- strsplit(input[1], ",")[[1]]
cat(count_domain(emails, input[2]), sep = "\n")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểmTự luyện tập: Trình biên dịch R online