首页 文章

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

提问于
浏览
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'表达式更为一致 . 我试图用"Programming with dplyr"小插图中的信息解决这个问题,但没有运气 . 有人能指出我正确的方向吗?

3 回答

  • 4

    我们可以使用 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"
    
  • 2

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

  • 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)))
    

相关问题