让dplyr变异使用公式

让dplyr变异使用公式,r,dplyr,formula,R,Dplyr,Formula,我有一个大数据集存储在一个长数据框中。我想提取一些变量的数据,并使用公式生成新数据。应从公式中提取所有必要的信息。首先,我想使用公式中的信息来过滤数据集中相应的变量-我使用all.vars()函数来实现这一点。我还依赖于CRAN上的formula.tools包。它用于轻松提取方程式的左侧和右侧(lhs和rhs) 库(dplyr) 图书馆(E2) 库(公式.工具) 种子集(100) _数据这是一个解决方案吗 add_variable <- function(df, equation){

我有一个大数据集存储在一个长数据框中。我想提取一些变量的数据,并使用公式生成新数据。应从公式中提取所有必要的信息。首先,我想使用公式中的信息来过滤数据集中相应的变量-我使用
all.vars()
函数来实现这一点。我还依赖于CRAN上的
formula.tools
包。它用于轻松提取方程式的左侧和右侧(
lhs
rhs

库(dplyr)
图书馆(E2)
库(公式.工具)
种子集(100)

_数据这是一个解决方案吗

add_variable <- function(df, equation){
      df <- filter(df, variable %in% all.vars(equation))
      orig_vars <- unique(df$variable)
      df <- dcast(df, country + year ~ variable)

      df <- mutate_(df, rhs(equation))
      colnames(df)[ncol(df)] <- as.character(lhs(equation))

      df <- melt(df, id.vars = c("country", "year"))
      df <- filter(df, !variable%in%orig_vars)
    }

    result <- add_variable(the_data, GDPpC ~ GDP / Population)
    result
  country year variable      value
1     CHN 2000    GDPpC 0.04885649
2     CHN 2010    GDPpC 2.62313658
3     CHN 2020    GDPpC 0.31685382
4     DEU 2000    GDPpC 0.80180998
5     DEU 2010    GDPpC 0.62642877
6     DEU 2020    GDPpC 0.97587188
7     USA 2000    GDPpC 0.26383912
8     USA 2010    GDPpC 1.01303516
9     USA 2020    GDPpC 0.69851501

add_variable许多年后,我在这里结束了,当时我正在寻找有关在
dplyr::mutate
中使用公式的信息,因为我经常发现这更简洁明了
dplyr
当然自2016年以来一直在增长和变化,包括
transmute
现在被弃用的事实。但好消息是,如果您愿意使用
formula.tools
解决方案非常简洁。如下图所示

库(dplyr)
#可再现播放数据
设定种子(2020年)
播放数据1-25.80405
#> 2    -20.48974
#> 3    -37.87361
#> 4    -46.52231
#> 5    -19.88420
#> 6    -16.49153
#> 7    -37.25498
#> 8    -41.02025
#> 9    -31.88338
#> 10   -42.17896
#> 11   -30.75905
#> 12   -10.42447
#> 13   -25.84538
#> 14   -46.08206
#> 15   -13.51940
#> 16   -25.30124
#> 17   -19.80536
#> 18   -26.42881
#> 19   -38.02190
#> 20   -30.51113
至于OP最初的示例和细节,它稍微复杂一些,因为数据必须成形,但基本概念是相同的。唯一的扭曲是
dcast
和最后的
select
,以删除计算中使用的变量

库(dplyr)
图书馆(E2)
库(公式.工具)
种子集(100)
数据百分比
dcast(国家+年份~变量)%>%
突变(!!lhs(方程):=!!rhs(方程))%>%
选择(-all.vars(等式)[2:长度(all.vars(等式))])
}
特定_函数(_数据,GDPpC~GDP/人口)
#>国家年GDPpC
#>1 CHN 2000 0.04885649
#>2 CHN 2010 2.62313658
#>3 CHN 2020 0.31685382
#>4德国2000 0.80180998
#>5德国2010 0.62642877
#>6德国2020 0.97587188
#>7美国2000 0.26383912
#>8美国2010 1.01303516
#>9美国2020 0.69851501

由(v0.3.0)于2020-05-04创建。

很难说你的问题是什么,谢谢,你是对的。我已经试着改进了。
add_variable <- function(df, equation){
      df <- filter(df, variable %in% all.vars(equation))
      orig_vars <- unique(df$variable)
      df <- dcast(df, country + year ~ variable)

      df <- mutate_(df, rhs(equation))
      colnames(df)[ncol(df)] <- as.character(lhs(equation))

      df <- melt(df, id.vars = c("country", "year"))
      df <- filter(df, !variable%in%orig_vars)
    }

    result <- add_variable(the_data, GDPpC ~ GDP / Population)
    result
  country year variable      value
1     CHN 2000    GDPpC 0.04885649
2     CHN 2010    GDPpC 2.62313658
3     CHN 2020    GDPpC 0.31685382
4     DEU 2000    GDPpC 0.80180998
5     DEU 2010    GDPpC 0.62642877
6     DEU 2020    GDPpC 0.97587188
7     USA 2000    GDPpC 0.26383912
8     USA 2010    GDPpC 1.01303516
9     USA 2020    GDPpC 0.69851501