首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逐组复制数据帧

逐组复制数据帧
EN

Stack Overflow用户
提问于 2019-05-30 10:52:21
回答 3查看 743关注 0票数 1

我有以下数据框架:

代码语言:javascript
复制
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"))

我想根据Group列复制列索引,每一个数字连续出现n一次,第二次所有数字都显示为组n次数,其中n是组的大小(类似于repeachrep )。

所以输出应该是这样的(让我们只看第1组,因为它太长了):

第一种选择:

代码语言:javascript
复制
df = structure(list(Group = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), index = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 
4, 4, 4)), row.names = c(NA, -16L), class = c("tbl_df", "tbl", 
"data.frame"))

第二种选择:

代码语言:javascript
复制
df = structure(list(Group = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), index = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 
2, 3, 4)), row.names = c(NA, -16L), class = c("tbl_df", "tbl", 
"data.frame"))

如何使用group_by完成此操作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-30 11:14:15

你可以像这样使用repslice

代码语言:javascript
复制
library(dplyr)

备选案文1:

代码语言:javascript
复制
df %>%
  group_by(Group) %>%
  slice(rep(seq_len(n()), each = n())) 

备选案文2:

代码语言:javascript
复制
df %>%
  group_by(Group) %>%
  slice(rep(seq_len(n()), n()))
票数 3
EN

Stack Overflow用户

发布于 2019-05-30 11:18:44

您可以使用dolapply的组合来复制整个组

代码语言:javascript
复制
df %>% group_by(Group) %>% 
  do(lapply(.,rep,times=nrow(.)) %>% as.data.frame())
df %>% group_by(Group) %>% 
  do(lapply(.,rep,each=nrow(.)) %>% as.data.frame())
票数 1
EN

Stack Overflow用户

发布于 2019-05-30 13:53:41

我们可以使用uncount

代码语言:javascript
复制
library(tidyverse)
df %>% 
  group_by(Group) %>% 
  uncount(n())
# A tibble: 61 x 2
# Groups:   Group [3]
#   Group index
#   <dbl> <dbl>
# 1     1     1
# 2     1     1
# 3     1     1
# 4     1     1
# 5     1     2
# 6     1     2
# 7     1     2
# 8     1     2
# 9     1     3
#10     1     3
# … with 51 more rows

或者使用data.table

代码语言:javascript
复制
library(data.table)
setDT(df)[, .SD[rep(seq_len(.N), .N)], Group]

或使用base R

代码语言:javascript
复制
do.call(rbind, lapply(split(df, df$Group), 
       function(x) x[rep(seq_len(nrow(x)), nrow(x)),]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56376835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档