这个问题实际上几乎是我上一个问题的重复(map函数中的一个对象无法识别(,但由于我遇到了类似的问题,我想对这个现象有一个准确的了解。
假设我有以下数据帧,
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)
得到一个错误:CCD_ 3。
然而,如果我尝试另一个代码如下,
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)
然后我成功地得到了预期的输出。
两者的区别在于,我刚刚在第二段代码中在map
函数之外声明了我的原始函数fun_group
,但结果完全不同,我很难理解是什么导致了这种差异。
如果你能让我知道map
功能导致这些不同结果的确切机制,我将不胜感激
很抱歉两次发布类似的问题,非常感谢您提前提供的帮助!
使用pmap
怎么样。它自动使数据帧的第一列.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