Menu
CoddyTech

筛选行

本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 44 课,共 64 课。

每行对应一个值的逻辑向量会选出值为 TRUE 的行。把它放在逗号前面,并将列这一侧留空,这样就会保留所有列:

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, ]))

输出:

  name age   city
1  ada  36 london
3   cy  41   rome
[1] 2

用 &(两者都满足)和 |(满足其中一个)组合条件。每个部分都会比较整列,因此结果仍然是每行一个值:

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"])

输出:

  name age   city
1  ada  36 london
[1] "bo" "cy"

subset(df, condition) 可以用更短的代码实现相同的功能,因为在它内部可以直接使用列名:

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)

输出:

[1] "ada" "cy" 

如果没有匹配的行,结果就是一个有 0 行的数据框,因此读取数据前要先检查 nrow():

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

输出:

[1] 0
[1] "none"
challenge icon

挑战

简单

完成 adults_in(df, city)。df 包含 name、age 和 city 列。按行顺序返回年龄至少为 18 岁且居住在 city 的人的姓名,并用 , 连接;如果没有符合条件的人,则返回 none。

提供的代码通过 read.csv(text = input) 从输入中读取表格:第一行是列名,后续每一行都是一条记录,值之间用逗号分隔。输入的最后一行是城市,代码会打印返回的值。

亲手试试

adults_in <- function(df, city) {
  # 在这里编写你的代码
  "none"
}

# 提供的输入和输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
df <- read.csv(text = input[-length(input)])
cat(adults_in(df, input[length(input)]), sep = "\n")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: R 在线编译器