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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:39:01