使用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()
代码解释
group_by(group):按分组单独处理每个组的数据mutate(row_num = row_number()):生成组内行号,用来定位连续行的范围filter(...):sample(1:(n()-3), size = 1):在当前分组的有效起始位置中随机选一个(n是组内总行数,减3是因为要保证从该位置开始能取到4行)- 筛选出从起始位置到起始位置+3的行,也就是连续4行
select(-row_num):移除辅助的行号列,保留原数据的列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
相关产品推荐
相关产品推荐

