如何用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
相关产品推荐
相关产品推荐

