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

如何用group_by按组实现数据框index列的两种复制方式?

用dplyr的group_by实现两种分组复制index的需求

嘿,这两种重复需求用dplyr的group_by配合基础的rep函数就能轻松搞定,我给你一步步拆解:

首先先把原始数据贴出来,方便大家复现测试:

library(dplyr)

# 原始输入数据框
df <- structure(list(Group = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3), 
                     index = c(1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3)), 
                row.names = c(NA, -13L), 
                class = c("tbl_df", "tbl", "data.frame"))

方式1:每个index数值连续重复「组大小」次

这种需求对应rep(x, each = n)的逻辑——把组内每个index值单独重复n次(n是当前组的行数)。用group_by分组后,我们可以用mutate生成列表列,再展开成行:

# 实现方式1
df_result1 <- df %>%
  group_by(Group) %>%
  # 用list()把重复后的向量包装成列表列,每个组保留一行
  mutate(index = list(rep(index, each = n()))) %>%
  # 把列表列拆成多行
  unnest(index) %>%
  # 取消分组,回到普通数据框
  ungroup()

# 验证Group 1的结果,和你给出的示例完全匹配
df_result1 %>% filter(Group == 1)

如果你觉得unnest有点麻烦,也可以用summarise直接生成结果,写法更简洁:

# 方式1的替代写法
df_result1_alt <- df %>%
  group_by(Group) %>%
  summarise(index = rep(index, each = n()), .groups = "drop")

方式2:整个组的index序列重复「组大小」次

这种需求对应rep(x, times = n)的逻辑——把整个组的index序列整体重复n次。实现思路和方式1类似,只是把each换成times:

# 实现方式2
df_result2 <- df %>%
  group_by(Group) %>%
  mutate(index = list(rep(index, times = n()))) %>%
  unnest(index) %>%
  ungroup()

# 验证Group 1的结果,和你给出的示例完全匹配
df_result2 %>% filter(Group == 1)

同样,也可以用summarise的简化写法:

# 方式2的替代写法
df_result2_alt <- df %>%
  group_by(Group) %>%
  summarise(index = rep(index, times = n()), .groups = "drop")

两种写法的核心都是利用group_by后,n()会自动返回当前组的行数(也就是你要的重复次数n),再结合rep的each和times参数实现两种不同的重复逻辑。

内容的提问来源于stack exchange,提问作者Omry Atia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:53:28