HOWTO · R

在 R 中查找行号

本教程演示如何在 R 中查找值的行号。

本页内容

使用 which() 查找满足条件的所有行位置,或使用 match() 查找每个待查询值第一次出现的位置。例如,which(staff$role == "Senior Dev") 会返回 staff 中每个匹配行的位置。如果没有行满足条件,which() 会返回 integer(0)。使用 match() 时,找不到查询值会返回 NA。

当逻辑测试或查找向量与数据框的行顺序一致时,这些位置就是行号。对于一般的 R 数据框,行位置从 1 开始。如果需要的是行标签,可以比较 rownames(data) 的结果,或使用 match() 查找。

使用 which() 查找行号

which() 接收一个逻辑向量,并返回其中值为 TRUE 的位置。比较数据框的一列会生成这样的逻辑向量,因此返回的位置对应数据框中相同行顺序的行。该函数会返回所有匹配项,适合用于可能选出多行的条件。

运行以下示例:

staff <- data.frame(
  name = c("Ari", "Bea", "Chen", "Devi"),
  role = c("Analyst", "Senior Dev", "Senior Dev", "Manager")
)
which(staff$role == "Senior Dev")

结果包含位置 2 和 3,因为这两行的角色都符合条件。要按数值条件或复合条件查找行,可以修改逻辑表达式。例如,which(grades$Math > 80) 会选出所有 Math 值大于 80 的行。如果之后要用这些位置对另一个对象进行子集筛选,请留意数据框的行顺序。

对于自定义行名,可以比较 rownames() 返回的标签:

people <- data.frame(name = c("Ari", "Bea", "Chen"))
rownames(people) <- c("north", "central", "south")
which(rownames(people) == "central")

这会返回行标签为 central 的行位置;标签本身并不是行号。如果已有一个与各行一一对应的向量,也可以用 which(values == target) 进行同样的查找。对于独立向量,结果应称为位置;只有当该向量代表数据框的各行时,位置才是行号。

如果比较结果包含缺失值,which() 不会返回这些值的位置。如果需要将缺失值作为条件处理,请先在逻辑表达式中明确处理,再调用 which()。

使用 match() 查找值第一次出现的位置

如果要查找某个值在向量、列或行名向量中第一次出现的位置,请使用 match(query, table)。query 可以包含一个或多个值,结果会为每个查询值返回一个位置。与 which() 不同,match() 对每个查询值只返回第一次出现的位置。默认情况下,若 table 中没有某个查询值,就会返回 NA。

查找数据框列时,将要查找的值放在前面,列放在后面:

staff <- data.frame(
  role = c("Analyst", "Senior Dev", "Senior Dev", "Manager")
)
match("Senior Dev", staff$role)

返回的位置是 2,也就是第一次匹配的行,即使该值之后还会再次出现。向量也可以使用相同的形式:match(78, grades) 会查找 78 第一次出现的位置。要查找行标签的位置,可以使用 match("central", rownames(people))。

将多个待查值作为向量传入,即可分别取得它们的位置:

grades <- c(88, 90, 75, 94, 80)
match(c(75, 94, 70), grades)

结果依次给出 75 和 94 的位置,随后为 70 返回 NA。这些位置按查询值的顺序排列,而不是按表中的顺序排列。如果表中有重复值,每个查询仍会对应其第一次出现的位置。若查询值不存在,在用返回位置筛选另一个对象之前,请先检查结果是否为 NA。

结论

当条件可能匹配多行,而且需要所有匹配位置时,选择 which();没有匹配项时,它会返回 integer(0)。当要查找一个或多个值,并需要每个值第一次出现的位置时,选择 match();找不到某个值时,它会返回 NA。对于这两个函数,只有在被查找向量与数据框行顺序相同时,返回位置才对应数据框的行。若需要的是行标签而非位置,请使用 rownames()。