在 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)))
我正在尝试使用 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)))