дублировать кадр данных n раз с помощью отличительной переменной - PullRequest
1 голос
/ 10 апреля 2019

Я бы хотел вырастить foo, продублировав его n раз и выделить каждую копию foo уникальным значением новой переменной. Если n равно 3, я могу сделать это многословно:

library(tidyverse)

foo <- mtcars %>%
  filter(row_number() < 3)

# desired result
bind_rows(
  foo %>% mutate(key = "a"),
  foo %>% mutate(key = "b"),
  foo %>% mutate(key = "c")
)
#>   mpg cyl disp  hp drat    wt  qsec vs am gear carb key
#> 1  21   6  160 110  3.9 2.620 16.46  0  1    4    4   a
#> 2  21   6  160 110  3.9 2.875 17.02  0  1    4    4   a
#> 3  21   6  160 110  3.9 2.620 16.46  0  1    4    4   b
#> 4  21   6  160 110  3.9 2.875 17.02  0  1    4    4   b
#> 5  21   6  160 110  3.9 2.620 16.46  0  1    4    4   c
#> 6  21   6  160 110  3.9 2.875 17.02  0  1    4    4   c

Я пытаюсь найти более экономный способ сделать это. В идеале я хотел бы поместить решение в одну строку, в которую foo передается с %>%.

Моя (неудачная) purrr попытка:

foo %>%
  map_dfr(c("a", "b", "c"), ~ mutate(., key = .x))

Ответы [ 2 ]

3 голосов
/ 10 апреля 2019

В вашей попытке использовать purrr выполнение foo %>% не поможет вам, потому что вам не нужно foo, чтобы быть первым аргументом map_dfr.Вместо этого вы можете просто сделать:

map_dfr(c("a", "b", "c"), ~ mutate(foo, key = .x))

Если вы хотите продолжать использовать канал, но прекратить передачу foo в качестве первого аргумента, вы можете окружить map_dfr с помощью {}, который подавляетавтоматическая передача аргументов:

foo %>%
    { map_dfr(c("a", "b", "c"), function(x) { mutate(., key = x)}) }

(могут быть более элегантные способы сделать это, используя разные magrittr трубы, я в основном придерживаюсь %>%)

3 голосов
/ 10 апреля 2019

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

library(tidyverse)
set_names(replicate(3, foo, simplify = FALSE), letters[1:3])  %>% 
               bind_rows(.id = 'key')

Или используя uncount

uncount(foo, 3) %>% 
    mutate(key = rep(letters[1:3], each = 2))

или с unnest

foo %>% 
   mutate(key = list(letters[1:3])) %>% 
   unnest
#  mpg cyl disp  hp drat    wt  qsec vs am gear carb key
#1  21   6  160 110  3.9 2.620 16.46  0  1    4    4   a
#2  21   6  160 110  3.9 2.620 16.46  0  1    4    4   b
#3  21   6  160 110  3.9 2.620 16.46  0  1    4    4   c
#4  21   6  160 110  3.9 2.875 17.02  0  1    4    4   a
#5  21   6  160 110  3.9 2.875 17.02  0  1    4    4   b
#6  21   6  160 110  3.9 2.875 17.02  0  1    4    4   c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...