R语言如何高效从dataframe单列中按间隔取每组5行的子集
R 高效采样实现方案
你的需求本质是从每10行数据中提取前5行、跳过后5行,总样本量刚好从600降到300,以下是几种简洁的实现方法:
方法1:基础R模运算筛选(最推荐,无额外依赖)
直接利用行号除以10的余数做筛选,一行代码即可完成:
set.seed(1) df <- data.frame(rnorm(600)) # 核心筛选逻辑:行号模10的结果在1-5之间的行即为目标行 subset.df <- df[(seq(nrow(df)) %% 10) %in% 1:5, , drop = FALSE]
说明:加drop = FALSE是为了避免单列表自动转为向量,保持dataframe结构不变。
方法2:序列生成法
通过生成起始索引批量拼接目标行号,逻辑更直观:
# 生成每10行的起始位置:1,11,21...591 starts <- seq(from = 1, to = nrow(df), by = 10) # 每个起始位置扩展为连续5个行号 idx <- as.vector(outer(starts, 0:4, `+`)) subset.df <- df[idx, , drop = FALSE]
方法3:dplyr语法实现
如果习惯使用tidyverse生态,可以用slice函数实现:
library(dplyr) subset.df <- df %>% slice(which(row_number() %% 10 %in% 1:5))
以上三种方法得到的结果和你手动拼接索引得到的结果完全一致,代码量大幅缩减,也支持任意长度的数据集扩展,不需要手动修改索引范围。
内容的提问来源于stack exchange,提问作者Thanatocoenose
相关产品推荐
相关产品推荐

