R中使用dplyr保留数据框首尾两行并筛选中间行的实现方法
完全可以通过dplyr的行索引和条件过滤组合实现,不需要手动拆分数据再rbind,以下是两种实现方案:
方案1:单filter实现(代码最简)
利用row_number()获取当前行的索引位置,n()获取数据框总行数,直接在过滤条件中区分不同区域的保留规则:
library(dplyr) result <- test %>% filter( # 保留前2行、倒数第2行、最后1行 row_number() %in% c(1, 2, n()-1, n()) | # 中间区域(第3行到倒数第3行)仅保留originDestinType不等于1的行 (row_number() >=3 & row_number() <= n()-2 & originDestinType != 1) )
运行后得到的result即为6行的目标数据框,行顺序和原数据完全一致。
方案2:分步实现(逻辑更清晰)
如果需要对中间区域单独做额外处理,可以拆分步骤,最后再绑定数据:
library(dplyr) # 提取中间区域符合条件的行 mid_part <- test %>% slice(3:(n()-2)) %>% filter(originDestinType != 1) # 提取首尾固定保留的行,和中间部分合并后按原顺序排序 result <- test %>% slice(1,2,n()-1,n()) %>% bind_rows(mid_part) %>% arrange(row_number())
两种方案都兼容行数变化的场景,不需要手动修改中间行的索引数值,比手动rbind更灵活。
内容的提问来源于stack exchange,提问作者Jingjun
相关产品推荐
相关产品推荐

