【问题标题】:Formula evaluation with mutate()使用 mutate() 进行公式评估
【发布时间】:2014-05-19 10:31:03
【问题描述】:

有没有办法让mutate() 评估 R 的 (d)plyr 包中的公式?我想到了一个有很多变量的情况,比如count.a, count.b, ..., count.z,我想创建一个新变量来总结所有这些。我可以创建一个像"count.total = count.a + count.b + (...) + count.z" 这样的字符串,但是如何让mutate() 对其进行评估呢?

【问题讨论】:

    标签: r plyr dplyr


    【解决方案1】:

    如果你想要表达式输入

    library(dplyr)
    df = data.frame(x = 1:10, y = 2:11)
    
    f = function(df, s){
        eval(substitute(mutate(df, z = s)))
    }
    f(df, x-y)
    f(df, x+y)
    

    如果你想输入字符

    g = function(df, s){
        q = quote(mutate(df, z = s))
        eval(parse(text=sub("s", s, deparse(q))))
    }
    g(df, "x-y")
    g(df, "x+y")
    

    您还可以修改函数以将z 的名称作为输入。

    表达式输入:f1 将所有额外参数传递给mutatef2 仅将一个参数传递给mutate

    f1 = function(df, ...){
        mutate(df, ...)
    }
    f1(df, a = x-y)
    
    
    f2 = function(df, ...){
        dots = substitute(alist(...))
        var = names(dots)[2]
        cal = as.call(list(quote(mutate), quote(df)))
        cal[var] = dots[2]
        eval(cal)
    }
    f2(df, a = x-y)
    

    再次,如果你想使用字符输入

    g1 = function(df, s){
        q = quote(mutate(df, z = s))
        eval(parse(text=sub("z = s", s, deparse(q))))
    }
    g1(df, "a=x-y")
    g1(df, "w=x+y")
    

    【讨论】:

    • 很好的答案,谢谢。如果您可以修改函数以将 z 的名称作为参数,这对阅读此问题的人将有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多