Menu
CoddyTech

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] 2

Kế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"
challenge icon

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")
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch R online