r - 如何使用向量长度不一致的 purrr::map2()
问题描述
我想根据 4 个不同的列生成汇总统计信息。不同的汇总统计是基于标签列(有两个值)和不同的组列(组 1、2 和 3)计算的。因此,您会为 Label1*group1、Label1*group2 等获得不同的 tbl。
set.seed(123)
tbl <- tibble(
label = rep(c("Label1", "Label2"), 6),
group1 = rep(c("a", "b", "c", "d"), 3),
group2 = rep(c("x", "y","z"), 4),
group3 = rep(c("1", "1", "2", "2", "3", "3"), 2),
value1 = rnorm(12, 100, 10),
value2 = rnorm(12, 50, 5)
)
tbl
我制作了一个示例函数,我希望该函数使用两个向量作为.x
参数.y
。
tmp_label <- c("Label1", "Label2") # .x
group <- c("group1", "group2", "group3") # .y
# .f
tmp_function <- function(Label, group) {
tbl %>%
filter(label %in% tmp_label) %>%
group_by(group) %>%
summarise(mean = mean(value1),
mean2 = mean(value2)) %>%
mutate(Label = tmp_label)
}
因此,我认为purrr::map2()
似乎使用适当的函数来获取不同的汇总统计信息。但是,它会产生一个错误,告诉我映射的向量必须具有一致的长度。因此我的问题是 1)是否可以使用purrr
函数来处理不一致的向量长度,以及 2)如果没有,是否有另一种(最好是整洁的)方法来获得不同的汇总统计数据。产生的错误:
map2(.x = tmp_label, .y = group, .f = tmp_function)
Error: Mapped vectors must have consistent lengths:
* `.x` has length 2
* `.y` has length 3
任何帮助将非常感激!
解决方案
我们可以将字符串更改group_by
为group_by_at
输入。此外,根据描述,OP 对“tmp_label”、“group”向量的组合感兴趣。我们可以crossing
用来创建所有的组合并将其传入map2
library(dplyr)
library(purrr)
library(tidyr)
tmp_function <- function(Label, group) {
tbl %>%
filter(label %in% Label) %>% # changed the tmp_label to Label
group_by_at(group) %>%
summarise(mean = mean(value1),
mean2 = mean(value2)) %>%
mutate(Label = Label)
}
d1 <- crossing(tmp_label, group)
map2(d1$tmp_label, d1$group, tmp_function)
推荐阅读
- c# - Zedgraph X 轴平移或缩放 C#
- reactjs - 为什么值不与 value 属性绑定?
- hashicorp-vault - 用户可以在从 github 创建令牌时指定 Vault 的策略吗?
- python - Python plt在for循环中绘图 - 不工作
- android - 如何仅从收件箱中接收来自android中特定号码的短信
- c++ - 使用 std::sort 对矩阵进行排序
- java - 了解 cpu 和 mem SIGAR 输出
- asp.net-mvc - MVC 完整日历错误
- java - Java 8 流从 List 中的 Map 读取值
- javascript - 用cheerio解析节点js