如何在R中编写if语句比较dataframe相邻行并保留匹配整行数据
R语言实现相邻行匹配后保留整行数据的解决方法
你原有代码的问题是存储时仅提取了data$Animals单列的值,只要调整为存储整行切片或行号,即可保留全部列数据。以下是两种可直接使用的实现方案:
方法1:修正原有循环逻辑(适合理解原理)
# 初始化待保留行号向量 keep_rows <- c() n <- nrow(data) # 循环遍历所有相邻行对 for (i in 1:(n-1)) { if (isTRUE(data$Animals[i] == data$Animals[i+1])) { # 把匹配的两行行号都加入待保留列表 keep_rows <- c(keep_rows, i, i+1) } } # 去重行号(避免连续多个相同值时行号重复添加)后提取对应整行 keep_rows <- unique(keep_rows) result <- data[keep_rows, ]
方法2:向量化操作(更适合6.8万行大数据集,运行效率更高)
基础R版本
n <- nrow(data) # 判断当前行和下一行是否相等 match_next <- c(data$Animals[-n] == data$Animals[-1], FALSE) # 判断当前行和上一行是否相等 match_prev <- c(FALSE, data$Animals[-1] == data$Animals[-n]) # 满足任一条件则保留整行 result <- data[match_next | match_prev, ]
dplyr版本(可读性更强)
library(dplyr) result <- data %>% filter(Animals == lag(Animals, default = "") | Animals == lead(Animals, default = ""))
效果验证
以你给出的示例数据测试,运行后返回结果如下,完全符合需求:
# 构造示例数据 data <- data.frame( Animals = c("dog", "cat", "cat"), Extra_test_col = c("test1", "test2", "test3") ) # 返回结果 Animals Extra_test_col 2 cat test2 3 cat test3
注意事项
- 如果
Animals列存在NA值,isTRUE()包裹判断逻辑可避免NA值导致的判断异常。 - 6.8万行的数据集优先使用向量化方法,运行速度比循环快5~10倍。
内容的提问来源于stack exchange,提问作者Molly K
相关产品推荐
相关产品推荐

