【问题标题】:Character parameter in variable变量中的字符参数
【发布时间】:2018-07-02 16:44:26
【问题描述】:

我想定义一个函数

factor <- function(var1)
  {
     df['var1'] <- as.factor(df['var1'])
  }

转换变量的类型

并像这样使用factor(var1) 不带引号!

【问题讨论】:

  • 您可能并不想在函数中硬编码数据集名称。您只需传入一个变量名,它可以是data.frame 中的一列。不过这个功能和直接使用as.factor()是一样的,所以不知道你要达到什么目的?
  • 提出一个明确的问题并选择一个能吸引合适人的标题

标签: r


【解决方案1】:

使用 tidyeval 方法,您可以使用 rlang::sym 将字符串转换为符号,然后在 mutate!! 中取消引用它。另见this answer

library(rlang)
library(tidyverse)

# create a test data frame
iris1 <- head(iris) %>% 
  as.tibble() %>% 
  mutate(Species = as.character(Species))
iris1

#> # A tibble: 6 x 5
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>          <dbl>       <dbl>        <dbl>       <dbl> <chr>  
#> 1          5.1         3.5          1.4         0.2 setosa 
#> 2          4.9         3            1.4         0.2 setosa 
#> 3          4.7         3.2          1.3         0.2 setosa 
#> 4          4.6         3.1          1.5         0.2 setosa 
#> 5          5           3.6          1.4         0.2 setosa 
#> 6          5.4         3.9          1.7         0.4 setosa

str(iris1)

#> Classes 'tbl_df', 'tbl' and 'data.frame':    6 obs. of  5 variables:
#>  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4
#>  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9
#>  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7
#>  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4
#>  $ Species     : chr  "setosa" "setosa" "setosa" "setosa" ...

# build function
myfactor <- function(df, var1)
{
  var1 <- sym(var1)
  df <- df %>% mutate(!! var1 := as.factor(!! var1))
  return(df)
}

myfactor(iris1, 'Species')

#> # A tibble: 6 x 5
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
#> 1          5.1         3.5          1.4         0.2 setosa 
#> 2          4.9         3            1.4         0.2 setosa 
#> 3          4.7         3.2          1.3         0.2 setosa 
#> 4          4.6         3.1          1.5         0.2 setosa 
#> 5          5           3.6          1.4         0.2 setosa 
#> 6          5.4         3.9          1.7         0.4 setosa

reprex package (v0.2.0.9000) 于 2018 年 7 月 2 日创建。

【讨论】:

    【解决方案2】:

    您需要使用substitute 来捕获变量名,然后make 是deparse 的名称/字符

    facr <- function(var1)
    {
      v=deparse(substitute(var1))
      df[v] <- as.factor(df[[v]])
      df
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多