[英]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"))
並嘗試根據現有列的組合(例如a11
和b11
)添加四個新列。
(預期輸出)
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.