1

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

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”表达式更一致。我已经尝试使用“使用 dplyr 编程”小插图中的信息来解决这个问题,但没有运气。谁能指出我正确的方向?

4

3 回答 3

4

您正在寻找该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, 但这会将提供的函数应用于所有选定的变量。

于 2017-12-01T09:35:45.690 回答
2

我们可以使用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"
于 2017-12-01T09:35:55.673 回答
1

我发现了如何通过最少的转换来做到这一点:

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)))
于 2017-12-02T08:16:29.717 回答