【发布时间】:2021-06-06 18:57:26
【问题描述】:
我认为这个问题与Using map_dfr and .id for list names and list of list names 有关,但不完全相同...
我经常将map_dfr 用于我想使用每个参数的值,而不是它的名称,作为.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=., ...) 之类的建议:很好,但稍微对于映射函数已经返回小标题的情况不太方便,因为我们必须添加一个否则不必要的@987654331 @调用:
list(2, 4, 6) %>%
map_dfr(~ tibble(name=.,
broom::tidy(lm(mpg~cyl, data=mtcars, offset=rep(., nrow(mtcars))))))
【问题讨论】:
-
为什么不只是
list(2, 4, 6) %>% map_dfr(~ tibble(x = mean(mtcars$mpg^.x), names = .x))? -
可行(您可以将其作为答案发布,我至少会赞成)但我的示例可能太简单了:在很多情况下,返回的对象已经是一个 tibble 而我没有不想添加另一个
tibble()语句... -
我不确定你的目标到底是什么,但对于更新后的问题,你可以直接
list(2, 4, 6) %>% map_dfr(~ broom::tidy(lm(mpg~cyl, data=mtcars, offset=rep(., nrow(mtcars)))) %>% mutate(names = .x))。 -
很公平。然后
names列将是最后一列,虽然...(lots of discussion 关于我们如何/是否可以轻松地使mutate在开头/左侧添加变量...)