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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:45:42