R通过列嵌套映射

R通过列嵌套映射,r,loops,apply,tidyverse,purrr,R,Loops,Apply,Tidyverse,Purrr,我得到了一个在这里求解的函数。 此函数用于获取一个填充了注释的列和另一个分组列,并将注释传播到缺少值的行 f1 <- function(data, group_col, expand_col){ data %>% dplyr::group_by({{group_col}}) %>% dplyr::mutate( {{expand_col}} := dplyr::case_when( !is.na({{expand_col}})

我得到了一个在这里求解的函数。
此函数用于获取一个填充了注释的列和另一个分组列,并将注释传播到缺少值的行

f1 <- function(data, group_col, expand_col){
  data %>%
    dplyr::group_by({{group_col}}) %>%
    dplyr::mutate( 
      {{expand_col}} := dplyr::case_when(
        !is.na({{expand_col}}) ~ 
          {{expand_col}} ,
      any( !is.na({{expand_col}})  ) & is.na({{expand_col}}) ~ 
        paste(unique(unlist(str_split(na.omit({{expand_col}}), " ")) ), 
                         collapse = " "),
      TRUE ~ 
        NA_character_  
    ))  %>%
    dplyr::ungroup()
}  

我可以这样使用它

> t %>%
+   f1(c,e) %>%
+   f1(b,e) %>%
+   f1(c,d) %>%
+   f1(b,d)
# A tibble: 8 x 5
  a         b     c d     e    
  <chr> <dbl> <dbl> <chr> <chr>
1 a         1     1 D     A    
2 b         1     1 D     A    
3 c         1     2 D     C    
4 d         1     2 D     C    
5 e         2     3 E     G H  
6 f         2     3 E     G H  
7 g         2     4 E     G    
8 h         2     4 E     H    
3:2 %>% 
  map(
    function(x) 4:5 %>% 
      map(
        function(y) f1(
          t, 
          !!(colnames(t)[x]) , 
          !!(colnames(t)[y])
        ) 
      )
  )
但结果是一个错误的混乱局面


提前感谢

这可以在
for
循环中轻松完成

i1 <- rep(names(t)[3:2], 2)
i2 <- rep(names(t)[4:5], each = 2)
for(i in seq_along(i1))
t <- f1(t, !! rlang::sym(i1[i]), !! rlang::sym(i2[i]))
t
# A tibble: 8 x 5
#  a         b     c d     e    
#  <chr> <dbl> <dbl> <chr> <chr>
#1 a         1     1 D     A    
#2 b         1     1 D     A    
#3 c         1     2 D     C    
#4 d         1     2 D     C    
#5 e         2     3 E     G H  
#6 f         2     3 E     G H  
#7 g         2     4 E     G    
#8 h         2     4 E     H    

i1由于
f1
接受列名,您需要首先将索引转换为符号:

v1 <- rlang::syms( colnames(t)[3:2] )
v2 <- rlang::syms( colnames(t)[4:5] )

是否需要将
c
e
作为带引号的字符串传递。此外,这是函数的顺序应用是的,这是函数的顺序应用。我认为应该引用它,因为
t%>%f1(3,5)
不起作用。但是我想作为列索引传递,就像第3列和第5列一样,但我认为
dplyr
不接受它。实际上,我发现它工作
t%>%f1(!!(colnames(t)[3]),!!(colnames(t)[5])
。因此,我需要了解如何使用map按顺序进行操作(或者可能应用)。map的问题在于它不是按顺序进行的,您可能需要在之后进行合并。我会检查
?compose
我认为
for
循环会更容易<代码>i1我不知道为什么,但它不起作用。另外,我想避免副作用。但无论如何,我尝试了这种方法,
for(4:5中的I){for(3:2中的j){t@AurelianoGuedes.我忘记在!rlang::sym(names(t)[I]):无效的参数类型4.eval(lhs,parent,parent)3.eval(lhs,parent,parent)2.data%>%dplyr::group_by({{group_col}…1.f1(!!rlang::sym(names(t)[I])),!!rlang::sym(names(t)[i])
它已更新
>packageVersion('rlang');packageVersion('dplyr');[1]'0.4.0'[1]'0.8.3'
@AurelianoGuedes。对不起,忘记了'i1'和'i2'
v1 <- rlang::syms( colnames(t)[3:2] )
v2 <- rlang::syms( colnames(t)[4:5] )
V <- tidyr::crossing( v1, v2 )
Res <- purrr::reduce2( V$v1, V$v2, f1, .init=t )

# Validation
Res2 <- t %>% f1(c,e) %>% f1(b,e) %>% f1(c,d) %>% f1(b,d)
identical(Res, Res2)   # TRUE