Передайте список в purrr :: map и используйте seq_along в .x - PullRequest
0 голосов
/ 14 февраля 2019

Часто я генерирую списки тиблей, которые затем хочу перенаправить в вызов purrr::map.Довольно часто я хочу добавить столбец идентификатора к каждому фрагменту, а затем соединить их вместе.Я ищу способ не создавать промежуточные переменные, которые загрязняют мою глобальную среду, просто чтобы иметь возможность использовать seq_along для добавления столбца id.

Загрузить библиотеку:

library(tidyverse)

Создать представление:

reprex_list <- list(Aleena = structure(list(
  name = "Ratts Tyerell", height = 79L,
  mass = 15, hair_color = "none", skin_color = "grey, blue",
  eye_color = "unknown", birth_year = NA_real_, gender = "male",
  homeworld = "Aleen Minor", films = list("The Phantom Menace"),
  vehicles = list(character(0)), starships = list(character(0))
), class = c(
  "tbl_df",
  "tbl", "data.frame"
), row.names = c(NA, -1L)), Besalisk = structure(list(
  name = "Dexter Jettster", height = 198L, mass = 102, hair_color = "none",
  skin_color = "brown", eye_color = "yellow", birth_year = NA_real_,
  gender = "male", homeworld = "Ojom", films = list("Attack of the Clones"),
  vehicles = list(character(0)), starships = list(character(0))
), class = c(
  "tbl_df",
  "tbl", "data.frame"
), row.names = c(NA, -1L)), Cerean = structure(list(
  name = "Ki-Adi-Mundi", height = 198L, mass = 82, hair_color = "white",
  skin_color = "pale", eye_color = "yellow", birth_year = 92,
  gender = "male", homeworld = "Cerea", films = list(c(
    "Attack of the Clones",
    "The Phantom Menace", "Revenge of the Sith"
  )), vehicles = list(
    character(0)
  ), starships = list(character(0))
), class = c(
  "tbl_df",
  "tbl", "data.frame"
), row.names = c(NA, -1L)))

Отсюда мне нужно сгенерировать промежуточную переменную в моей глобальной среде и запуститьСнова отобразим карту следующим образом:

species_id <- names(reprex_list) # don't want to have to break the pipe and add this to my blobal environment
map(.x = seq_along(reprex_list), .f = ~reprex_list[[.x]] %>%
  dplyr::mutate(species = species_id[[.x]])) %>%
  map(.f = ~ .x %>% mutate_all(as.character)) %>%
  purrr::reduce(full_join) %>%
  type_convert()

Глупо, но вместо этого мне хотелось бы:

reprex_list %>% # Sometimes this is piped in from many previous lines of code so I don't want to have to assign this to a separate variable to be able to carry on.
  map(.x = seq_along(.), .f = ~ .[[.x]] %>% dplyr::mutate(species = names(.)[[.x]])) %>%
  map(.f = ~ .x %>% mutate_all(as.character)) %>%
  purrr::reduce(full_join) %>%
  type_convert()

Но последнее не работает.Теперь очевидно, что лишние хлопоты здесь минимальны, но иногда у меня уже было несколько строк кода, прежде чем я сгенерирую промежуточный список, который я затем должен назначить отдельной переменной.А затем снова начните пиппинг, что, я уверен, может быть сделано в одном фрагменте кода, но я пока не нашел для этого пути.Есть идеи?Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2019

Попробуйте использовать purrr::map_dfr с указанным аргументом .id:

reprex_list %>% map_dfr(~mutate_all(., as.character), .id='species')

Или даже лучше добавить столбец видов и ничего не делать:

reprex_list %>% map_dfr(identity, .id='species')

РЕДАКТИРОВАТЬ:

reprex_list %>% bind_rows(.id = "species")

на самом деле лучший способ сделать это, согласно комментарию выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...