【问题标题】:mutate_at in combination with the value of a fixed columnmutate_at 结合固定列的值
【发布时间】:2018-08-21 21:39:54
【问题描述】:

我有一个数据框,其中包含几列可能的目标值(在我的示例中,下面的 value 和 value2)和一些带有预测值的列。这些列都以“predMod”开头。现在我想计算所有“predMod”列之间的差异,我的目标变量值。

例子:

target = "value2"

       date    value value2 predModLM1 predModLM2
1  2015-07-01    NA      5   3.236827   3.291434
2  2015-07-02    NA      5   3.236827   3.291434
3  2015-07-03    NA      5   3.236827   3.291434
4  2015-07-04    NA      5   3.236827   3.291434
5  2015-07-05    NA      5   3.236827   3.291434
6  2015-07-06   3.4      5   3.236827   3.291434
7  2015-07-07   3.4      5   3.236827   3.291434
8  2015-07-08   3.4      5   3.236827   3.291434
9  2015-07-09   3.4      5   3.236827   3.291434
10 2015-07-10   3.4      5   3.236827   3.291434

现在应该计算以“predMod”开头的每一列与来自目标的“value2”列之间的差异。

我可以通过:

results <- data %>%
select(date, target, contains("predMod")) %>%
mutate_at(. , vars(-c(date, target)), funs(residuals = . - value2))

结果:

         date value2 predModLM1 predModLM2 predModLM1_residuals   predModLM2_residuals
1  2015-07-01      5   3.236827   3.291434            -1.763173              -1.708566
2  2015-07-02      5   3.236827   3.291434            -1.763173            -1.708566
3  2015-07-03      5   3.236827   3.291434            -1.763173            -1.708566
4  2015-07-04      5   3.236827   3.291434            -1.763173            -1.708566
5  2015-07-05      5   3.236827   3.291434            -1.763173            -1.708566
6  2015-07-06      5   3.236827   3.291434            -1.763173            -1.708566
7  2015-07-07      5   3.236827   3.291434            -1.763173            -1.708566
8  2015-07-08      5   3.236827   3.291434            -1.763173            -1.708566
9  2015-07-09      5   3.236827   3.291434            -1.763173            -1.708566
10 2015-07-10      5   3.236827   3.291434            -1.763173            -1.708566

但在我的解决方案中,它硬编码在 funs (-> funs(residuals = . - value2) 中。如果我将 value2 更改为 target (-> funs(residuals = . - target),则整个事情都不起作用。 .. 我该如何解决这个问题?

一个想法是用位置参数替换 value2。目标值总是像这样在第 2 列中。但我失败了:-(

提前非常感谢, 马可

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    为此,我们需要将字符串转换为符号并进行评估 (!!)

    library(tidyverse)
    data %>%
      select(date, target, contains("predMod")) %>%
      mutate_at(vars(-date, -target), funs(residuals = . - !! rlang::sym(target)))
    #      date value2 predModLM1 predModLM2 predModLM1_residuals predModLM2_residuals
    #1  2015-07-01      5   3.236827   3.291434            -1.763173            -1.708566
    #2  2015-07-02      5   3.236827   3.291434            -1.763173            -1.708566
    #3  2015-07-03      5   3.236827   3.291434            -1.763173            -1.708566
    #4  2015-07-04      5   3.236827   3.291434            -1.763173            -1.708566
    #5  2015-07-05      5   3.236827   3.291434            -1.763173            -1.708566
    #6  2015-07-06      5   3.236827   3.291434            -1.763173            -1.708566
    #7  2015-07-07      5   3.236827   3.291434            -1.763173            -1.708566
    #8  2015-07-08      5   3.236827   3.291434            -1.763173            -1.708566
    #9  2015-07-09      5   3.236827   3.291434            -1.763173            -1.708566
    #10 2015-07-10      5   3.236827   3.291434            -1.763173            -1.708566
    

    【讨论】:

    • 太好了,非常感谢!工作正常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 2012-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多