创建呼叫并循环遍历小标题列

时间:2019-05-16 09:00:09

标签: r dplyr rlang

我编写了一个函数,用于将小标题的字符变量转换为因子,进行一些操作,然后再次将因子转换为字符(如果它们首先是字符)。我想通过拨打电话来做到这一点。

library(tidyverse)
library(stringr)
library(rlang)

N <- 100
d <- tibble(a = sample(LETTERS[1:4], N, replace = TRUE),
            b = sample(letters[20:23], N, replace = TRUE),
            x = round(rnorm(N, 100, 20), 1),
            y = as.numeric(sample(30:45, N, replace = TRUE)))

dplyr_xx <- function(d, ...) {
  call_vec <- map_chr(d, ~str_c("as.", class(.), sep = ""))
  d %>%
    mutate_if(is.character, as_factor) %>%
    # ... %>%
    imap_dfc(., ~ .x %>%
               exec(call_vec[.y])) # -> error
}
d %>%
  dplyr_xx(a, x, y)

如何纠正以上功能?

1 个答案:

答案 0 :(得分:2)

?exec帮助页面上,我们看到要调用的函数应作为第一个参数提供,然后是该函数的其他任何附加参数。

在您的情况下,call_vec[.y]是函数,.x是参数。撰写

.x %>% exec(call_vec[.y])

它等效于

exec(.x, call_vec[.y])

,它们的参数顺序错误(该函数现在是第二个参数,而不是第一个)。更改订单可解决此问题:

dplyr_xx <- function(d, ...) {
  call_vec <- map_chr(d, ~str_c("as.", class(.), sep = ""))
  d %>% mutate_if(is.character, as_factor) %>%
      ## ... %>%
      imap_dfc(., ~exec(call_vec[.y], .x))
}
d %>% dplyr_xx(a, x, y)
# # A tibble: 100 x 4
#    a     b         x     y
#    <chr> <chr> <dbl> <dbl>
#  1 A     t     150.     34
#  2 A     u     116.     32
#  3 C     w      81.2    30
# ...