当前位置: 首页 > 知识库问答 >
问题:

R:对作为字符串作为 dplyr 突变的值给出的表达式的条件求值

阎知
2023-03-14

我正在尝试使用case_when执行一个dplyr::mutate()来在由字符串片段组装而成的各种公式之间进行选择。然而,我显然没有在引用和取消引用之前将字符串正确地转换成表达式。我已经尝试了七八种这样做的方法,都不成功。

从字符串组合表达式的原因是,我有大量变量组,其名称仅由后缀不同,例如,用于区分名义或通货膨胀调整后的美元中的变量。我使用case_when,因为相似的变量在不同的年份具有不同的名称,有时具有不同的聚合结构。

这是一个非常简单的例子:

bus_inc <- function(tb, suffix) {
  bus1     <- quo(paste0("incbus", suffix, " + ",  "incfarm", suffix, collapse = ""))
  bus2     <- quo(paste0("incbus2", suffix, " + ",  "incfarm", suffix, collapse = ""))
  bus3     <- quo(paste0("incbus", suffix, " + ",  "incfarm2", suffix, collapse = ""))
  out      <- mutate(tb, bus = case_when((year < 1968) ~ UQ(bus1),
                                   ((year > 1967) & (year < 1976)) ~ UQ(bus2),
                                   (year > 1975) ~ UQ(bus3)))
  out
}

数据:

incbus_99     <-   1:56
incfarm_99   <-  57:112
incbus2_99   <-  incbus_99 + 0.5
incfarm2_99 <-  incfarm_99 * 10
year <- 1962:2017
test_tb <- tibble(year, incbus_99, incfarm_99, incbus2_99, incfarm2_99)

my_test <- bus_inc(tb  = test_tb, suffix = "_99")
my_test

< code>bus的值在1962年应为58,在1968年应为70.5。

我发现许多地方建议将解析(text=“my_string”)作为将字符串转换为表达式的一种方法,例如Martin Maechler的早期示例(2002)。但我也发现了很多地方说永远不要这样做,比如《财富》106和马丁·梅切勒最近的例子。我认为令人敬畏的梅奇勒博士对他提出的一个解决方案的有力否定,他提供了有力的证据,证明这不是一个好主意,但我不理解他提出的替代方案,因为它们似乎对字符串进行了评估。

共有1个答案

郎建章
2023-03-14

可能使用sym()expr()的组合(您还需要将用作.numeric,因为不一致的类型将在case_when>中抛出错误)。。。

bus_inc <- function(tb, suffix) {
  bus1 <- expr(!!sym(paste0('incbus', suffix)) + !!sym(paste0('incfarm', suffix)))
  bus2 <- expr(!!sym(paste0('incbus2', suffix)) + !!sym(paste0('incfarm', suffix)))
  bus3 <- expr(!!sym(paste0('incbus', suffix)) + !!sym(paste0('incfarm2', suffix)))
  mutate(tb, bus = case_when(year < 1968 ~ as.numeric(!!bus1),
                             year > 1967 & year < 1976 ~ as.numeric(!!bus2),
                             year > 1975 ~ as.numeric(!!bus3)))
}

library(dplyr)

incbus_99     <-   1:56
incfarm_99   <-  57:112
incbus2_99   <-  incbus_99 + 0.5
incfarm2_99 <-  incfarm_99 * 10
year <- 1962:2017
test_tb <- tibble(year, incbus_99, incfarm_99, incbus2_99, incfarm2_99)

bus_inc(tb  = test_tb, suffix = "_99")

# # A tibble: 56 x 6
#     year incbus_99 incfarm_99 incbus2_99 incfarm2_99   bus
#    <int>     <int>      <int>      <dbl>       <dbl> <dbl>
#  1  1962         1         57        1.5         570  58  
#  2  1963         2         58        2.5         580  60  
#  3  1964         3         59        3.5         590  62  
#  4  1965         4         60        4.5         600  64  
#  5  1966         5         61        5.5         610  66  
#  6  1967         6         62        6.5         620  68  
#  7  1968         7         63        7.5         630  70.5
#  8  1969         8         64        8.5         640  72.5
#  9  1970         9         65        9.5         650  74.5
# 10  1971        10         66       10.5         660  76.5
# # ... with 46 more rows
 类似资料:
  • 我有一个像这样的数据框 由reprex包(v2.0.1)于2022-02-17创建 我想group_by col1,当count_col2 当count_col1 我希望我的数据看起来像这样 我不确定这是否可以通过变异(case_when…)来实现。到目前为止,我失败了

  • 我有一个带有键值对的数组,数组列是id和name。我想按ID对这个数组进行排序。 id列值的类型是字符串类型,但我想将它们排序为数字值,也应该在IE上工作 尽管顺序确实发生了变化,但它并没有像预期的那样发生变化,在IE中也会抛出一个错误。

  • 问题: 我想简化以下数据框 我希望能够将农民总结为一个单独的逗号,并将吨与观察结果相加,使其看起来像以下内容 我想谈以下几点 我所尝试的: 我尝试过使用dplyr函数组,并在下面对每个函数进行总结 然而,我不确定如何集成求和数值,而不使用摘要函数专门调用每一列, 感谢您的帮助。

  • 问题内容: 我是Java的新手,我不太确定如何将整数加幂作为字符串输出。我知道 实际上会计算出将双精度数提高到幂的值。但是,如果我想输出“ 2 ^ 6”作为输出(除了6作为上标而不是克拉),我该怎么做? 编辑:这是一个Android应用程序。我以整数形式传递给幂的整数,我想知道如何在手机的UI中将其转换为上标。 问题答案: 如果要将文本输出到GUI,则可以使用HTML格式和标记获取上标。否则,您将

  • 我用mtcars数据集来说明我的问题。 例如,我想将数据子集到4-cyl汽车。我可以做到: 在我的工作中,我需要传递一个字符串变量作为我的列名。例如: 我也做了: 在这两种情况下,我都得到空数据帧。

  • QueryDsl 3.3.4 Hibernate 3.6.10-Final I有两个实体: org.hibernate.hql.ast.tree.SelectClause.InitializeExplicitSelectClause(SelectClause.java:156)