повторять фрейм данных n раз при добавлении столбца - PullRequest
0 голосов
/ 07 декабря 2018

Это мой воспроизводимый код:

df <- data.frame(x = c(1, 2), y = c(3, 4))

df1 <- df %>% mutate(z = 1)
df2 <- df %>% mutate(z = 2)
df3 <- df %>% mutate(z = 3)

df <- rbind(df1, df2, df3)

df

Я повторяю исходный фрейм данных df 3 раза, добавляя один столбец, где число в столбце указывает на повторение.В моем случае я должен сделать это более 3 раз.Я мог бы использовать петлю, но есть ли более аккуратный способ?Я думаю, я не могу использовать expand.grid.

Ответы [ 5 ]

0 голосов
/ 07 декабря 2018

Несколько других способов, которые еще не рассмотрены:

# setup
df = data.frame(x = c(1, 2), y = c(3, 4))
n = 3

# simple row indexing, add column manually
result = df[rep(1:nrow(df), 3), ]
result$id = rep(1:n, each = nrow(df))

# cross join in base
merge(df, data.frame(id = 1:n), by = NULL)

# cross join in tidyr
tidyr::crossing(df, data.frame(id = 1:n))

# dplyr version of the row-index method above
slice(df, rep(1:n(), n)) %>% mutate(id = rep(1:n, each = nrow(df)))

Вдохновение в значительной степени опирается на мой старый вопрос, Как я могу повторить кадр данных? .В основном тот же вопрос, но без требования в столбце id.

0 голосов
/ 07 декабря 2018

Еще один вариант использования base R

n <- 3
do.call(rbind, 
        Map(`[<-`, replicate(n = n, 
                             expr = df, 
                             simplify = FALSE), 
            "z", 
            value = seq_len(n)))
#  x y z
#1 1 3 1
#2 2 4 1
#3 1 3 2
#4 2 4 2
#5 1 3 3
#6 2 4 3
0 голосов
/ 07 декабря 2018

Вы также можете сделать это с merge:

dfz <- data.frame(z = 1:3)

merge(df, dfz)

#   x y z
# 1 1 3 1
# 2 2 4 1
# 3 1 3 2
# 4 2 4 2
# 5 1 3 3
# 6 2 4 3
0 голосов
/ 07 декабря 2018

Мы также можем сделать перекрестное соединение с sqldf.Это создает декартово произведение df и таблиц reps:

library(sqldf)
reps <- data.frame(z = 1:3)

sqldf("select * from df, reps order by z")

или просто с map_dfr из purrr:

library(purrr)

map_dfr(1:3, ~cbind(df, z = .))

Выход:

  x y z
1 1 3 1
2 2 4 1
3 1 3 2
4 2 4 2
5 1 3 3
6 2 4 3
0 голосов
/ 07 декабря 2018

Мы можем создать столбец list и unnest

library(tidyverse)
df %>%
   mutate(z = list(1:3)) %>%
   unnest %>%
   arrange(z)
#  x y z
#1 1 3 1
#2 2 4 1
#3 1 3 2
#4 2 4 2
#5 1 3 3
#6 2 4 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...