簡體   English   中英

無法識別 map function 內部的 object(另一種情況)

[英]An object inside map function is not recognized (another case)

這個問題實際上和我之前的問題幾乎是重復的( An object inside map function is not Recognized ),但是由於我遇到了類似的問題,所以我想得到一個准確的理解。

假設我有以下數據框,

df <- structure(list(a11 = c(TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE),
                     a12 = c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE),
                     a21 = c(TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
                     a22 = c(FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), 
                     b11 = c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE),
                     b12 = c(TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE),
                     b21 = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE),
                     b22 = c(TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE)),
                row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))

並嘗試根據現有列的組合(例如a11b11 )添加四個新列。

(預期輸出)

structure(list(Group11 = c("g1", "g1", "g3", "g3", "g2", "g2", "g1", "g3", "g2", "g3"),
               Group12 = c("g3", "g1", "g4", "g2", "g3", "g1", "g4", "g3", "g1", "g1"),
               Group21 = c("g1", "g2", "g1", "g2", "g3", "g2", "g1", "g3", "g4", "g2"),
               Group22 = c("g3", "g2", "g2", "g1", "g3", "g3", "g4", "g3", "g3", "g3")),
          row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))

我首先嘗試了這段代碼:

1:2 %>% expand_grid(i1=., i2=.) %>% mutate(data=map2(i1, i2, function(i1, i2){
  df %>% transmute(
    !!(str_c("Group", i1, i2)):=if_else(!!sym(str_c("a", i1, i2)),
                                        if_else(!!sym(str_c("b", i1, i2)), "g1", "g2"),
                                        if_else(!!sym(str_c("b", i1, i2)), "g3", "g4"))) %>% return()
})) %>% .$data %>% reduce(bind_cols)

並收到一條錯誤消息: Error: object 'i1' not found

但是,如果我嘗試如下另一個代碼,

fun_group <- function(i1, i2){
  df %>% transmute(
    !!(str_c("Group", i1, i2)):=if_else(!!sym(str_c("a", i1, i2)),
                                        if_else(!!sym(str_c("b", i1, i2)), "g1", "g2"),
                                        if_else(!!sym(str_c("b", i1, i2)), "g3", "g4"))) %>% return()
}
1:2 %>% expand_grid(i1=., i2=.) %>% mutate(data=map2(i1, i2, fun_group)) %>% .$data %>% reduce(bind_cols)

然后我成功得到了預期的output。

兩者的區別在於我只是在我的第二個代碼中將我原來的 function fun_group 聲明在map fun_group之外,但結果幾乎無法理解是什么造成的。

如果您能告訴我導致這些不同結果的map function 的確切機制,我將不勝感激。
很抱歉兩次發布類似問題,非常感謝您提前提供的幫助!

使用pmap怎么樣。 它會自動使 data.frame 的第一列.x和第二列.y

library(tidyverse)
1:2 %>%
  expand_grid(i1=., i2=.) %>%
  pmap_chr(~str_c(.x,.y)) %>%
  setNames(str_c("Group",.)) %>%
  map_dfc(~ df %>% 
            select(ends_with(.x)) %>%
            pmap_chr(~case_when(.x & .y ~ "g1",
                                .x & !.y ~ "g2",
                                !.x & .y ~ "g3",
                                !.x & !.y ~ "g4",
                                TRUE ~ NA_character_)))
# A tibble: 10 x 4
   Group11 Group12 Group21 Group22
   <chr>   <chr>   <chr>   <chr>  
 1 g1      g3      g1      g3     
 2 g1      g1      g2      g2     
 3 g3      g4      g1      g2     
 4 g3      g2      g2      g1     
 5 g2      g3      g3      g3     
 6 g2      g1      g2      g3     
 7 g1      g4      g1      g4     
 8 g3      g3      g3      g3     
 9 g2      g1      g4      g3     
10 g3      g1      g2      g3     

暫無
暫無

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

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