Lọc hàng
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 44 trên 64.
Một vectơ logic có một giá trị cho mỗi hàng sẽ chọn các hàng có giá trị là TRUE. Đặt vectơ này trước dấu phẩy và để trống phần cột để giữ lại mọi cột:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
print(people[people$age > 30, ])
print(nrow(people[people$age > 30, ]))Đầu ra:
name age city
1 ada 36 london
3 cy 41 rome
[1] 2Kết hợp các điều kiện bằng & (cả hai) và | (một trong hai). Mỗi phần so sánh toàn bộ một cột, vì vậy kết quả vẫn có một giá trị cho mỗi hàng:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
print(people[people$age > 30 & people$city == "london", ])
print(people$name[people$age < 25 | people$city == "rome"])Đầu ra:
name age city
1 ada 36 london
[1] "bo" "cy"subset(df, condition) thực hiện điều tương tự với code ngắn hơn, vì bên trong hàm này, bạn có thể dùng trực tiếp tên cột:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
older <- subset(people, age > 30)
print(older$name)Đầu ra:
[1] "ada" "cy" Khi không có hàng nào khớp, kết quả là một khung dữ liệu có 0 hàng, vì vậy hãy kiểm tra nrow() trước khi đọc dữ liệu từ đó:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
nobody <- people[people$age > 90, ]
print(nrow(nobody))
print(if (nrow(nobody) == 0) "none" else nobody$name[1])Đầu ra:
[1] 0
[1] "none"Thử thách
DễHoàn thiện adults_in(df, city). df có các cột name, age và city. Trả về tên của những người từ 18 tuổi trở lên và sống ở city, theo thứ tự hàng và nối bằng , , hoặc none.
Code được cung cấp đọc bảng từ đầu vào bằng read.csv(text = input): dòng đầu tiên chứa tên các cột và mỗi dòng tiếp theo là một hàng, với các giá trị được phân tách bằng dấu phẩy. Dòng đầu vào cuối cùng chứa tên thành phố, và code in ra giá trị được trả về.
Tự làm thử
adults_in <- function(df, city) {
# Viết code của bạn ở đây
"none"
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
df <- read.csv(text = input[-length(input)])
cat(adults_in(df, input[length(input)]), 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