簡體   English   中英

如何使用矢量長度不一致的 purrr::map2()

[英]How to use purrr::map2() with inconsistent vector lengths

我想根據 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM