You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中如何高效查找与向量匹配的data.frame行?

高效匹配数据框中符合指定模式的行

原始数据定义

pattern <- c("apple", "banana")
dat <- data.frame(fruit1 = c("melon", "apple", "mango", "apple"),
                  fruit2 = c("banana", "melon", "papaya", "banana"))

数据框dat的内容:

> dat
  fruit1 fruit2
1  melon banana
2  apple  melon
3  mango papaya
4  apple banana

需求说明

找出dat中所有列的元素都属于pattern向量的行,示例中第4行符合要求。

原方法的问题

手动遍历每行的循环实现虽然可行,但在数据框行数较多时效率低下:

output <- vector()
for(i in 1:nrow(dat)){
  output[i] <- all(dat[i, ] %in% pattern)
}
> which(output)
[1] 4

高效实现方式

推荐使用向量化操作替代手动循环,以下是几种高效方案:

方案1:利用rowSums结合逻辑矩阵

# 生成每个元素是否匹配pattern的逻辑矩阵
match_matrix <- dat %in% pattern
# 筛选出所有列都匹配的行号
result_rows <- which(rowSums(match_matrix) == ncol(dat))
> result_rows
[1] 4

原理:dat %in% pattern会生成与原数据框同维度的逻辑矩阵,rowSums计算每行的匹配数量,当数量等于列数时,说明该行所有元素都在pattern中。

方案2:使用优化后的apply函数

result_rows <- which(apply(dat, 1, function(x) all(x %in% pattern)))
> result_rows
[1] 4

原理:apply(dat, 1, ...)对数据框的每行批量应用判断函数,底层经过优化,效率远高于手动for循环。

方案3:基于交集长度的判断(适用于pattern无重复元素的场景)

result_rows <- which(apply(dat, 1, function(x) length(intersect(x, pattern)) == length(pattern)))
> result_rows
[1] 4

原理:当pattern元素唯一时,若行内元素与pattern的交集长度等于pattern的长度,说明该行所有元素都属于pattern。

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:36:22