在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
相关产品推荐
相关产品推荐

