如何在R分组数据框中标记size指定的正确区间游程长度?
问题描述
我有一个按grp分组的数据框:
df <- data.frame( v = rnorm(25), grp = c(rep("A",10), rep("B",15)), size = 2)
我想要根据size确定的区间游程长度标记分组内的区间。比如grp == "A"时,分组共10行,size为2,所以每个区间应包含10/2=5行。但我用以下代码生成的区间长度却是2:
df %>% group_by(grp) %>% mutate( interval = (row_number() -1) %/% size)
得到的输出如下:
# A tibble: 25 × 4 # Groups: grp [2] v grp size interval <dbl> <chr> <dbl> <dbl> 1 -0.166 A 2 0 2 -1.12 A 2 0 3 0.941 A 2 1 4 -0.913 A 2 1 5 0.486 A 2 2 6 -1.80 A 2 2 7 -0.370 A 2 3 8 -0.209 A 2 3 9 -0.661 A 2 4 10 -0.177 A 2 4 # … with 15 more rows
我需要的正确输出应该是这样的:
# A tibble: 25 × 4 # Groups: grp [2] v grp size interval <dbl> <chr> <dbl> <dbl> 1 -0.166 A 2 0 2 -1.12 A 2 0 3 0.941 A 2 0 4 -0.913 A 2 0 5 0.486 A 2 0 6 -1.80 A 2 1 7 -0.370 A 2 1 8 -0.209 A 2 1 9 -0.661 A 2 1 10 -0.177 A 2 1 # … with 15 more rows
解决方案
你需要调整区间的计算逻辑:不是用行号除以size,而是先计算每个区间应包含的行数(分组总行数 / size),再用行号基于这个数值来划分区间。
方法一:手动计算区间行数
library(dplyr) df %>% group_by(grp) %>% mutate( interval_rows = n() / size, interval = (row_number() - 1) %/% interval_rows ) %>% select(-interval_rows) # 可选:移除中间计算列
方法二:用cut函数简化实现
library(dplyr) df %>% group_by(grp) %>% mutate( interval = as.integer(cut(row_number(), breaks = size, labels = FALSE)) - 1 )
逻辑说明
- 方法一中,
n()获取当前分组的总行数,除以size得到每个区间的行数(比如A组10行/2=5行);(row_number()-1) %/% interval_rows将行号从0起始后,按区间行数取整,得到正确的区间标记。 - 方法二中,
cut函数直接把行号分成size个等份区间,转成整数后减1,得到从0开始的区间标记,代码更简洁。
两种方法都能得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

