【发布时间】:2021-05-09 22:45:24
【问题描述】:
我有一个分组的小标题。我想使用 map() 来遍历 tibble 的列。在每一列中,我希望map() 对每个组分别采取行动。换句话说,我希望map() 尊重 tibble 的分组结构。
但是map() 似乎并不尊重小标题的分组结构。这是一个最小的例子:
library(dplyr)
library(purrr)
data(iris)
iris %>%
group_by(Species) %>%
map(length)
在 iris 数据集中,有 3 个物种和 4 列(不包括“物种”)。因此,我希望 map() 返回一个 3 × 4 = 12 个长度的列表,或者返回一个总共有 12 个长度的嵌套列表。但它返回一个包含 5 个元素的列表:每列一个,计算分组列。这五个元素中的每一个都是一列的总长度 (150)。如何调整上面的代码以提供我想要的结果?
在这个最小的例子中,使用map() 的一个令人满意的替代方法是
iris %>%
group_by(Species) %>%
summarize(
mutate(across(everything(), length))
)
返回
# A tibble: 3 x 5
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
* <fct> <int> <int> <int> <int>
1 setosa 50 50 50 50
2 versicolor 50 50 50 50
3 virginica 50 50 50 50
但在大多数情况下,这种替代方法行不通。问题是我通常希望summarize() 和mutate 返回loess() 对象,而不是整数。当我试图让他们返回 loess() 对象时,他们会因类似的错误而窒息
Error: Problem with `summarise()` input `..1`.
x Input must be a vector, not a `loess` object.
【问题讨论】:
标签: r dplyr functional-programming purrr