是否有一種直接的、管道友好的方法來list從包含串列列的tibble生成物件?
考慮下面的例子。如果my_starwars是給定的tibble,我怎樣才能實作命名串列desired_output?
library(dplyr, warn.conflicts = FALSE)
library(purrr)
my_starwars <-
starwars %>%
slice(1)
films <- my_starwars %>% pull(films) %>% set_names("films")
vehicles <- my_starwars %>% pull(vehicles) %>% set_names("vehicles")
desired_output <- c(films, vehicles)
desired_output
#> $films
#> [1] "The Empire Strikes Back" "Revenge of the Sith"
#> [3] "Return of the Jedi" "A New Hope"
#> [5] "The Force Awakens"
#>
#> $vehicles
#> [1] "Snowspeeder" "Imperial Speeder Bike"
雖然上面的代碼可以完成這項作業,但我想要一些可以源于管道的更少的手冊,例如:
my_starwars %>%
build_list(films, vehicles, foo, bar) # this is a demo
## $films
## [1] "The Empire Strikes Back" "Revenge of the Sith" "Return of the Jedi" "A New Hope" ## "The Force Awakens"
## $vehicles
## [1] "Snowspeeder" "Imperial Speeder Bike"
## $foo
## [1] "foo" "foo" "foo"
## $bar
## [1] "bar" "bar"
有沒有一種直接的方法可以使用tidyverse工具來做到這一點?
編輯
盡管@GuedesBF 的解決方案對于初始my_starwars示例非常有用,但它因不同型別的小標題而失敗。所以我最初的例子太小了,不能代表我的問題。請考慮以下示例,其中trb包含 2 個串列列的 tibble,recipe每個串列列中都有一個物件。
library(recipes)
car_rec_1 <-
recipe(mpg ~ ., data = mtcars) %>%
step_ns(disp, deg_free = 5)
car_rec_2 <-
recipe(mpg ~ ., data = mtcars) %>%
step_dummy(am)
trb <-
tribble(~car_rec_1, ~car_rec_2,
car_rec_1, car_rec_2)
undesired_output_trb <-
trb %>%
lapply(unlist)
car_rec_1 <- trb %>% pull(car_rec_1) %>% setNames("car_rec_1")
car_rec_2 <- trb %>% pull(car_rec_2) %>% setNames("car_rec_2")
desired_output_trb <- c(car_rec_1, car_rec_2)
當我們使用@GuedesBF 的解決方案時,我們得到了undesired_output_trb,而我想要的是desired_output_trb. 如何做到這一點?
uj5u.com熱心網友回復:
我們可以unlist()對selected 列回圈應用一個函式。
my_starwars %>%
select(c(films, vehicles)) %>%
lapply(unlist)
#Or if tidyverse is a must, we can replace `lapply` with `purrr::map`
my_starwars %>%
select(c(films, vehicles)) %>%
map(unlist)
$films
[1] "The Empire Strikes Back" "Revenge of the Sith" "Return of the Jedi" "A New Hope" "The Force Awakens"
$vehicles
[1] "Snowspeeder" "Imperial Speeder Bike"
更新
OP 給出的第二個示例包含嵌套串列,其中包含串列元素的串列列。更簡單的lapply(unlist)或unclass()解決方案在這里不起作用。我們需要一個提供exra控制的unlisting函式,我會推薦purrr::pluck。map(my_starwars, pluck, 1)也適用于原始問題。
library(purrr)
trb %>%
map(pluck, 1)
identical(desired_output_trb, trb %>% map(pluck, 1))
[1] TRUE
uj5u.com熱心網友回復:
基于此答案,另一種解決方案是使用tidyr::pivot_longer()和tibble::deframe():
library(dplyr, warn.conflicts = FALSE)
library(tibble)
library(tidyr)
my_starwars <-
starwars %>%
slice(1)
my_starwars %>%
select(films, vehicles) %>%
pivot_longer(everything()) %>%
deframe()
#> $films
#> [1] "The Empire Strikes Back" "Revenge of the Sith"
#> [3] "Return of the Jedi" "A New Hope"
#> [5] "The Force Awakens"
#>
#> $vehicles
#> [1] "Snowspeeder" "Imperial Speeder Bike"
library(recipes)
car_rec_1 <-
recipe(mpg ~ ., data = mtcars) %>%
step_ns(disp, deg_free = 5)
car_rec_2 <-
recipe(mpg ~ ., data = mtcars) %>%
step_dummy(am)
trb <-
tribble(~car_rec_1, ~car_rec_2,
car_rec_1, car_rec_2)
trb %>%
pivot_longer(everything()) %>%
deframe()
#> $car_rec_1
#> Recipe
#>
#> Inputs:
#>
#> role #variables
#> outcome 1
#> predictor 10
#>
#> Operations:
#>
#> Natural Splines on disp
#>
#> $car_rec_2
#> Recipe
#>
#> Inputs:
#>
#> role #variables
#> outcome 1
#> predictor 10
#>
#> Operations:
#>
#> Dummy variables from am
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/398298.html
下一篇:為什么python生成器會這樣?
