使用purr::map\u dfr从值而不是名称分配id值
我认为这个问题与……有关,但不完全相同 我经常使用使用purr::map\u dfr从值而不是名称分配id值,r,purrr,R,Purrr,我认为这个问题与……有关,但不完全相同 我经常使用map\u dfr来表示希望使用每个参数的值而不是其名称作为.id变量的情况。下面是一个愚蠢的例子:我正在计算将mtcars$mpg的平均值提高到二次方、四次方和六次方: 库(tidyverse) 列表(2,4,6)%>%map\u dfr(~tibble(x=mean(mtcars$mpg^.),.id=“name”) ##名称x ## ## 1 1 439. ## 2 2 262350. #
map\u dfr
来表示希望使用每个参数的值而不是其名称作为.id
变量的情况。下面是一个愚蠢的例子:我正在计算将mtcars$mpg的平均值提高到二次方、四次方和六次方:
库(tidyverse)
列表(2,4,6)%>%map\u dfr(~tibble(x=mean(mtcars$mpg^.),.id=“name”)
##名称x
##
## 1 1 439.
## 2 2 262350.
## 3 3 198039783.
我希望name
变量是2,4,6,而不是1,2,3。我可以通过在管道中包括setNames(.data)
来解决这个问题:
列表(2,4,6)%>%
集合名(.data)%%>%
map_dfr(~tibble(x=平均值(mtcars$mpg^.)),.id=“name”)
但我想知道我是否缺少一种更惯用的方法
至于使用类似于
~tible(name=,…)
:不错,但对于映射函数已经返回tible的情况来说稍微不方便,因为我们必须添加一个不必要的tible()
调用:
列表(2,4,6)%>%
map_dfr(~tibble(name=.)。,
扫帚::整齐(长轴(英里/加仑~气缸,数据=平均车数,偏移量=代表(,,nrow(平均车数);))))
好的,我想我在发布前不久就发现了这个(所以我会回答)。指出tibble::lst()
是一个自命名列表函数,因此只要我们使用tibble::lst(2,4,6)
而不是list(2,4,6)
,它就可以工作,例如
lst(2,4,6)%>%map\u-dfr(~tibble(x=mean(mtcars$mpg^.)),.id=“name”)
这也可以:
库(tidyverse)
#@本·博克回答。
lst(2,4,6)%>%map\u dfr(~tibble(x=mean(mtcars$mpg^.),.id=“power”)
#>#tibble:3 x 2
#>幂x
#>
#> 1 2 439.
#> 2 4 262350.
#> 3 6 198039783.
列表(2,4,6)%>%map_df(~tibble(power=as.character(.x),x=mean(mtcars$mpg^.))
#>#tibble:3 x 2
#>幂x
#>
#> 1 2 439.
#> 2 4 262350.
#> 3 6 198039783.
#另一种选择
seq(2,6,2)%>%map2_df(重新运行(长度(.),mtcars$mpg),~c(x=as.character(.x),mean=round(平均值(.y^.x),0)))
#>#tibble:3 x 2
#>x均值
#>
#> 1 2 439
#> 2 4 262350
#> 3 6 198039783
由(v2.0.0)于2021-06-06创建,这也是可能的,但是这不是我的第一选择,只有
地图就足够了:
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.
库(purrr)
列表(2,4,6)%>%
pmap_dfr(~tibble(power=c(…),x=map_dbl(c(…),~mean(mtcars$mpg^.x)))
#一个tibble:3x2
幂x
1 2 439.
2 4 262350.
3 6 198039783.
list(2,4,6)%%>%map\u-dfr(~tibble(x=mean(mtcars$mpg^.x),names=.x))
?这很有效(你可以把它作为答案发布,我至少会投赞成票)但我的例子可能太简单了:在很多情况下,返回的对象已经是一个tibble,我不想再添加另一个tibble()
语句……我不确定您的目标到底是什么,但对于更新后的问题,您可以只做list(2,4,6)%%>%map\u dfr(~broom::tidy(lm(mpg~cyl,data=mtcars,offset=rep(,nrow(mtcars)))%>%mutate(names=.x))
足够公平。然后,names
列将是最后一列,不过…(关于如何/是否可以轻松地使mutate
在开头/左边添加变量…)适用于我给出的简单示例(应该包括前面更复杂的示例…)是的,这完全可能不是最好的。如果没有更早发布类似的示例,这将是我的第一选择:list(2,4,6)%%>%map\u dfr(~tibble(name=.x,x=mean(mtcars$mpg^.x)))
。但最好看看原始数据集的一部分。