代码之家  ›  专栏  ›  技术社区  ›  iantist

将文本粘贴到dplyr mutate中

  •  4
  • iantist  · 技术社区  · 7 年前

    我希望能够传递一个变量字符串以延迟到dplyr mutate函数中,但遇到了一些问题。例如,这样做很好:

     text <- "lag(depth)"
     diamonds %>% mutate_(text)
    

    但事实并非如此,这会导致一个错误:

     text <- "lag(depth), lag(table)"
     diamonds %>% mutate_(text)
    
    Error in parse(text = x) : <text>:1:11: unexpected ','
    1: lag(depth),
    

    这感觉应该是可能的。任何帮助都将不胜感激。

    3 回复  |  直到 7 年前
        1
  •  3
  •   patL grad student    7 年前

    必须连接文本:

    text <- c("lag(depth)", "lag(table)")
    

    然后使用 .dots 分析您的 text :

    library(dplyr)
    
    diamonds %>% 
      mutate_(.dots = text)
    
    ## A tibble: 53,940 x 12
    #   carat cut     color clarity depth table price     x     y     z `lag(depth)`
    #   <dbl> <ord>   <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>        <dbl>
    # 1 0.23  Ideal   E     SI2      61.5    55   326  3.95  3.98  2.43         NA
    # 2 0.21  Premium E     SI1      59.8    61   326  3.89  3.84  2.31         61.5
    # 3 0.23  Good    E     VS1      56.9    65   327  4.05  4.07  2.31         59.8
    # 4 0.290 Premium I     VS2      62.4    58   334  4.2   4.23  2.63         56.9
    # 5 0.31  Good    J     SI2      63.3    58   335  4.34  4.35  2.75         62.4
    # 6 0.24  Very G~ J     VVS2     62.8    57   336  3.94  3.96  2.48         63.3
    # 7 0.24  Very G~ I     VVS1     62.3    57   336  3.95  3.98  2.47         62.8
    # 8 0.26  Very G~ H     SI1      61.9    55   337  4.07  4.11  2.53         62.3
    # 9 0.22  Fair    E     VS2      65.1    61   337  3.87  3.78  2.49         61.9
    #10 0.23  Very G~ H     VS1      59.4    61   338  4     4.05  2.39         65.1
    ## ... with 53,930 more rows, and 1 more variable: `lag(table)` <dbl>
    
        2
  •  0
  •   Roman    7 年前

    作为另一种解决方案,您可以尝试使用 mutate_at . 函数 lag 必须使用此方法复制。

    library(tidyverse)
    a <- unlist(stringi::stri_extract_all_words(text)) 
    diamonds %>% 
      mutate_at(.vars = a[a %in% colnames(diamonds)], .funs = c(lag=a[duplicated(a)]))
    # A tibble: 53,940 x 12
       carat cut       color clarity depth table price     x     y     z depth_lag table_lag
       <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>     <dbl>     <dbl>
     1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43      NA          NA
     2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31      61.5        55
     3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31      59.8        61
     4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63      56.9        65
     5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75      62.4        58
     6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48      63.3        58
     7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47      62.8        57
     8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53      62.3        57
     9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49      61.9        55
    10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39      65.1        61
    
        3
  •  0
  •   akrun    7 年前

    我们可以这样做 parse_exprs rlang

    library(tidyverse)
    library(rlang)
    text <- "lag(depth); lag(table)" #note the `;` separation
    diamonds %>% 
         mutate(!!! parse_exprs(text))
    # A tibble: 53,940 x 12
    #   carat cut     color clarity depth table price     x     y     z `lag(depth)`
    #   <dbl> <ord>   <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>        <dbl>
    # 1 0.23  Ideal   E     SI2      61.5    55   326  3.95  3.98  2.43         NA  
    # 2 0.21  Premium E     SI1      59.8    61   326  3.89  3.84  2.31         61.5
    # 3 0.23  Good    E     VS1      56.9    65   327  4.05  4.07  2.31         59.8
    # 4 0.290 Premium I     VS2      62.4    58   334  4.2   4.23  2.63         56.9
    # 5 0.31  Good    J     SI2      63.3    58   335  4.34  4.35  2.75         62.4
    # 6 0.24  Very G… J     VVS2     62.8    57   336  3.94  3.96  2.48         63.3
    # 7 0.24  Very G… I     VVS1     62.3    57   336  3.95  3.98  2.47         62.8
    # 8 0.26  Very G… H     SI1      61.9    55   337  4.07  4.11  2.53         62.3
    # 9 0.22  Fair    E     VS2      65.1    61   337  3.87  3.78  2.49         61.9
    #10 0.23  Very G… H     VS1      59.4    61   338  4     4.05  2.39         65.1
    # ... with 53,930 more rows, and 1 more variable: `lag(table)` <dbl>