Создайте тиббл построчно, используя purrr - PullRequest
3 голосов
/ 16 апреля 2019

Как я могу создать тибл, используя purrr.Это мои не работающие попытки:

library(tidyverse)

vec <- set_names(1:4, letters[1:4])

map_dfr(vec, ~rep(0, 10)) # not working
bind_rows(map(vec, ~rep(0, 10))) # not working either

Это будет мое базовое решение R, но я бы хотел сделать это "аккуратно":

do.call(rbind, lapply(vec, function(x) rep(0, 10)))
#[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#a    0    0    0    0    0    0    0    0    0     0
#b    0    0    0    0    0    0    0    0    0     0
#c    0    0    0    0    0    0    0    0    0     0
#d    0    0    0    0    0    0    0    0    0     0

Обратите внимание, что респфункция не полная функция, которую я буду использовать.Это не было бы предпочтительным решением для моей проблемы:

as_tibble(matrix(rep(0, 40), nrow = 4, dimnames = list(letters[1:4])))

Спасибо и с уважением

Ответы [ 3 ]

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

Вот идея с использованием add_column и сохранением имен строк в виде столбца,

library(tidyverse)

enframe(vec) %>% 
 add_column(!!!set_names(as.list(rep(0, 10)),paste0('column', seq(10))))

, который дает,

# A tibble: 4 x 12
  name  value column1 column2 column3 column4 column5 column6 column7 column8 column9 column10
  <chr> <int>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>    <dbl>
1 a         1       0       0       0       0       0       0       0       0       0        0
2 b         2       0       0       0       0       0       0       0       0       0        0
3 c         3       0       0       0       0       0       0       0       0       0        0
4 d         4       0       0       0       0       0       0       0       0       0        0

Вы можете легко отброситьvalue колонка, если не требуется

2 голосов
/ 16 апреля 2019

Аналогично решению @ Sotos, но с использованием новой блестящей функции group_map, которая поставляется с dplyr 0.8 :

library(tidyverse)

enframe(vec) %>%
  group_by(name) %>%
  group_map(~rep(0,10) %>% as.list %>% bind_cols(.x, .))

Выход:

# A tibble: 4 x 12
# Groups:   name [4]
  name  value    V1    V2    V3    V4    V5    V6    V7    V8    V9   V10
  <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 a         1     0     0     0     0     0     0     0     0     0     0
2 b         2     0     0     0     0     0     0     0     0     0     0
3 c         3     0     0     0     0     0     0     0     0     0     0
4 d         4     0     0     0     0     0     0     0     0     0     0
1 голос
/ 16 апреля 2019

Это решение работает, хотя я вполне уверен, что есть другой способ структурирования вашего тибла, поэтому вам не нужно это построчное создание:

map(vec,~rep(0,10)) %>% map(enframe) %>% map(spread,name,value) %>% bind_rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...