Репликация фрейма данных по группам - PullRequest
1 голос
/ 30 мая 2019

У меня есть следующий фрейм данных:

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"))

Я хотел бы скопировать индекс столбца в соответствии со столбцом группы, один раз, когда каждое число появляется n раз подряд, и второй раз все числа появляются как группа n раз, где n это размер группы (аналогично rep против rep с each).

Таким образом, результат будет выглядеть следующим образом (давайте посмотрим только на группу 1, потому что он слишком длинный):

Первый вариант:

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"))

Второй вариант:

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?

Ответы [ 3 ]

3 голосов
/ 30 мая 2019

Вы можете использовать rep и slice вот так

library(dplyr)

Опция 1:

df %>%
  group_by(Group) %>%
  slice(rep(seq_len(n()), each = n())) 

Опция 2:

df %>%
  group_by(Group) %>%
  slice(rep(seq_len(n()), n()))
1 голос
/ 30 мая 2019

Мы можем использовать uncount

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

library(data.table)
setDT(df)[, .SD[rep(seq_len(.N), .N)], Group]

Или с base R

do.call(rbind, lapply(split(df, df$Group), 
       function(x) x[rep(seq_len(nrow(x)), nrow(x)),]))
1 голос
/ 30 мая 2019

Вы можете использовать комбинацию do и lapply для репликации всей группы

df %>% group_by(Group) %>% 
  do(lapply(.,rep,times=nrow(.)) %>% as.data.frame())
df %>% group_by(Group) %>% 
  do(lapply(.,rep,each=nrow(.)) %>% as.data.frame())
...