在 dplyr::mutate/transmute 中混合常量和变量列名称

mixing constant and variable column names in dplyr::mutate/transmute

我正在尝试使用 dplyr 更改数据框列的 class。目标列的名称包含在变量中

my_df<-data.frame(colour=c("red","blue","green"),
                  val1=as.character(c(1,12,13)),
                  val2=c(21,22,23))

target_var="val1"

经过一些摆弄后,我设法使用标准 R 子集实现了我的目标:

my_df %>% transmute(colour = colour,
                 !!myval := as.numeric(.[,myval]))

但我怀疑引用目标列的方式不那么复杂,这与其他 'dplyr' 表达式更一致。我曾尝试使用 "Programming with dplyr" 小插图中的信息来解决这个问题,但没有成功。谁能指出我正确的方向?

您正在查找 mutate_at 函数。那么您的代码将如下所示:

library(tidyverse) # to load dplyr and tibble

# I took the liberty to add val3 to show how you can do it with multiple variables
my_df <- data_frame(colour = c("red", "blue", "green"),
                    val1 = as.character(c(1, 12, 13)),
                    val2 = c(21, 22, 23),
                    val3 = as.character(c(1, 12, 13)))

# same here...
target_var <- c("val1", "val3")


my_df %>% 
  mutate_at(.funs = as.numeric, .vars = target_var)
#> # A tibble: 3 x 4
#>   colour  val1  val2  val3
#>    <chr> <dbl> <dbl> <dbl>
#> 1    red     1    21     1
#> 2   blue    12    22    12
#> 3  green    13    23    13

此方法的唯一缺点是您最终得到的是完整的数据集 (mutate),而不是选定的变量(与 transmutate 一样)。您可以使用 transmutate_at,但这会将提供的函数应用于所有选定的变量。

我们可以使用 sym 转换为 symbol,然后使用 !!

my_df %>%
    transmute(colour = colour, 
        !!target_var := as.numeric(as.character(!!rlang::sym(target_var))))
#    colour val1
#1    red    1
#2   blue   12
#3  green   13

注意:'val1' 是 factor,因为默认情况下 stringsAsFactors = TRUE。因此,我们需要将其转换为 character,然后再转换为 numeric

数据

my_df<-data.frame(colour=c("red","blue","green"),
              val1=as.character(c(1,12,13)),
              val2=c(21,22,23))

target_var <- "val1"

我找到了如何以最少的转化次数完成此操作:

my_df<-data.frame(colour=c("red","blue","green"),
              val1=as.character(c(1,12,13)),
              val2=c(21,22,23))

target_var="val1"

my_df %>% transmute(colour = colour,
                 !!my_val := as.numeric(!!as.symbol(target_var)))