首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串转换为调用dplyr函数

将字符串转换为调用dplyr函数
EN

Stack Overflow用户
提问于 2020-03-03 09:07:07
回答 1查看 52关注 0票数 1

示例

我想编写一个函数,它执行以下操作:

代码语言:javascript
复制
filter_and_compute <- function(df,
                               condition,
                               col_to_modify,
                               calculus) {
  df %>%
    filter( condition ) %>%
    mutate( col_to_modify = calculus ) %>%
    rbind(df %>% filter(! condition))
}

但使用字符串作为参数调用(df除外):

代码语言:javascript
复制
filter_and_compute(mtcars, "cyl == 4", "mpg", "2 * hp")

我所做的

我已经制作了这个版本,但是这是没有用的,因为我将列名作为字符串来操作:

代码语言:javascript
复制
filter_and_compute <- function(df,
                               filter_condition,
                               column_to_modify,
                               calculus) {
  enq_filter <-  enquo(filter_condition)
  enq_col_to_mod <- enquo(column_to_modify)
  enq_calculus <- enquo(calculus)
  (
    df
    %>% filter(!! enq_filter)
    %>% mutate(!! enq_col_to_mod := !! enq_calculus)
    %>% rbind( df %>% filter( ! (!! enq_filter)))
  )
}

filter_and_compute(mtcars, cyl == 4, mpg, 2 * cyl + hp)

我知道rlang::sym,但我不知道如何将它用于不可预测的表达式,如2 * cyl + hp.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-03 09:15:44

您可以将evalparse_expr结合使用

代码语言:javascript
复制
library(dplyr)
library(rlang)

filter_and_compute <- function(df,
                               condition,
                               col_to_modify,
                               calculus) {
  df %>%
    filter(eval(parse_expr(condition))) %>%
    mutate(!! col_to_modify := eval(parse_expr(calculus))) %>%
    rbind(df %>% filter(! eval(parse_expr(condition))))

}

filter_and_compute(mtcars, "cyl == 4", "mpg", "2 * hp")

#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#1  186.0   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#2  124.0   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#3  190.0   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#4  132.0   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#5  104.0   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#6  130.0   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#7  194.0   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#8  132.0   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#9  182.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#10 226.0   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#11 218.0   4 121.0 109 4.11 2.780 18.60  1  1    4    2
#12  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#....
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60503641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档