[英]assigning id values from values, not names, with purrr::map_dfr
我認為這個問題與使用 map_dfr and.id for list names 和 list of list names但不完全相同...
我經常將map_dfr
用於我想使用每個參數的值而不是它的name作為.id
變量的情況。 這是一個愚蠢的例子:我正在計算mtcars$mpg
的二、四和六次方的平均值:
library(tidyverse)
list(2,4,6) %>% map_dfr(~tibble(x=mean(mtcars$mpg^.)), .id="name")
## name x
## <chr> <dbl>
## 1 1 439.
## 2 2 262350.
## 3 3 198039783.
我希望name
變量為 2、4、6 而不是 1、2、3。我可以通過在管道中包含setNames(.data)
來破解它:
list(2,4,6) %>%
setNames(.data) %>%
map_dfr(~tibble(x=mean(mtcars$mpg^.)), .id="name")
但我想知道我是否缺少更慣用的方法?
至於使用類似~ tible(name=., ...)
的建議:很好,但對於映射function已經返回一個 tibble 的情況來說不太方便,因為我們必須添加一個否則不必要的tibble()
調用:
list(2, 4, 6) %>%
map_dfr(~ tibble(name=.,
broom::tidy(lm(mpg~cyl, data=mtcars, offset=rep(., nrow(mtcars))))))
好的,我想我在發布前不久發現了這個(所以我會回答)。 這個答案指出tibble::lst()
是一個自命名列表 function,所以只要我們使用tibble::lst(2,4,6)
而不是list(2,4,6)
,它就可以工作,例如
lst(2,4,6) %>% map_dfr(~tibble(x=mean(mtcars$mpg^.)), .id="name")
這也可以工作:
library(tidyverse)
#@ben Bolker answer.
lst(2,4,6) %>% map_dfr(~tibble(x=mean(mtcars$mpg^.)), .id="power")
#> # A tibble: 3 x 2
#> power x
#> <chr> <dbl>
#> 1 2 439.
#> 2 4 262350.
#> 3 6 198039783.
list(2, 4, 6) %>% map_df(~ tibble(power = as.character(.x) , x = mean(mtcars$mpg^.)))
#> # A tibble: 3 x 2
#> power x
#> <chr> <dbl>
#> 1 2 439.
#> 2 4 262350.
#> 3 6 198039783.
#another option
seq(2, 6, 2) %>% map2_df(rerun(length(.), mtcars$mpg), ~ c(x = as.character(.x), mean = round(mean(.y^.x), 0)))
#> # A tibble: 3 x 2
#> x mean
#> <chr> <chr>
#> 1 2 439
#> 2 4 262350
#> 3 6 198039783
由代表 package (v2.0.0) 於 2021 年 6 月 6 日創建
這也是可能的,但它不是我的首選,只有map
就足夠了:
library(purrr)
list(2, 4, 6) %>%
pmap_dfr(~ tibble(power = c(...), x = map_dbl(c(...), ~ mean(mtcars$mpg ^ .x))))
# A tibble: 3 x 2
power x
<dbl> <dbl>
1 2 439.
2 4 262350.
3 6 198039783.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.