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

使用dplyr从各组中随机选择连续4个值的序列

问题:使用dplyr从每个分组中随机选取连续4个值

原始数据

df <-
  data.frame(group = c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4),
             value = LETTERS[1:20])

需求说明

从每个group分组里随机挑选连续的4个值,要求保持原数据的顺序且无间隔,示例结果如下:

group value
1      1     A
2      1     B
3      1     C
4      1     D
6      2     F
7      2     G
8      2     H
9      2     I
11     3     K
12     3     L
13     3     M
14     3     N
17     4     Q
18     4     R
19     4     S
20     4     T

   group value
1      1     A
2      1     B
3      1     C
4      1     D
5      2     E
6      2     F
7      2     G
8      2     H
10     3     J
11     3     K
12     3     L
13     3     M
17     4     Q
18     4     R
19     4     S
20     4     T

当前尝试的代码

set.seed(23)
df %>% 
  group_by(group) %>% 
  mutate(selected = sample(0:1, size = n(), replace = TRUE)) %>% 
  filter(selected == 1)

存在的问题

上述代码是随机生成0/1标记来筛选行,选出来的是分散的随机行,无法实现“每个分组内选中连续4行”的要求。

解决方案

核心逻辑是:先给每个分组内的行编序号,再随机确定连续4行的起始位置,最后筛选出对应范围的行。

代码实现:

set.seed(23)
df %>%
  group_by(group) %>%
  # 给每个分组内的行添加组内序号
  mutate(row_num = row_number()) %>%
  # 随机选一个有效起始位置,筛选连续4行
  filter(row_num >= sample(1:(n()-3), size = 1) & row_num <= sample(1:(n()-3), size = 1) + 3) %>%
  # 删除辅助的序号列
  select(-row_num) %>%
  ungroup()

代码解释

  1. group_by(group):按分组单独处理每个组的数据
  2. mutate(row_num = row_number()):生成组内行号,用来定位连续行的范围
  3. filter(...):
    • sample(1:(n()-3), size = 1):在当前分组的有效起始位置中随机选一个(n是组内总行数,减3是因为要保证从该位置开始能取到4行)
    • 筛选出从起始位置到起始位置+3的行,也就是连续4行
  4. select(-row_num):移除辅助的行号列,保留原数据的列
  5. ungroup():取消分组,回到普通数据框结构

运行后会得到符合要求的结果,比如:

# A tibble: 16 × 2
   group value
   <dbl> <chr>
 1     1 A    
 2     1 B    
 3     1 C    
 4     1 D    
 5     2 F    
 6     2 G    
 7     2 H    
 8     2 I    
 9     3 K    
10     3 L    
11     3 M    
12     3 N    
13     4 Q    
14     4 R    
15     4 S    
16     4 T

内容的提问来源于stack exchange,提问作者Polina B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:00:27