我不知道是否有现有的方法来做这件事

让我举一个例子来说明一下:

library(tidyverse)    
temp = data.frame(a=1:2,b = 3:4,c = 5:6)

我可以使用tidyverse中的Mutations 方法和表达式列表来添加新列

mutation_list = list(d = quote(a+b),e = quote(a+b+c))
result = temp %>% mutate(!!!mutation_list)

然而,在某些情况下,有些列并不存在,在最简单的情况下,我们错过了列名c.

temp2 = temp[,c('a','b')]

我想让结果基于现有的变量计算所有可能的变量,在这个简单的例子中,d,因为ab都在那里,而对于e,它没有c,所以我们不能计算结果,我们只返回a,b,d的结果;没有抛出错误异常.即:

result = temp2 %>% mutate_onlyif_itcanfindvars(!!!mutation_list)

在这个简单的例子中,我们可以很容易地找到其他方法来编写它,但是,如果我们有像10000+这样的表达式列表,它必须有一些统一的方法来完成这一点.

答案不需要使用dplyr,您可以使用data.table或任何您想要的包,但我们需要将temp保存在data.Frame(或data.table或Tibble)中,并将xarition_list作为表达式列表(如果您使用其他形式,请解释它)

推荐答案

safely_transmute <- safely(transmute)

cbind(
  temp,
  imap(
      mutation_list,
    ~ {
      temp |>
        safely_transmute(!!.y := !!.x) |>
        getElement("result")                                             
    }
  ) |>
    list_cbind()
)

这个方法应该适用于像问题中这样的简单情况:

mutate_if_possible <- function(data, pattern) {
  
  for (calc in seq_along(pattern)) {
    
    used_columns <- str_subset(all.names(pattern[calc]), "[:alpha:]")
    
    if (!all(used_columns %in% names(data))) {
      next
    }
    
    data <- data |>
      mutate(!!!pattern[calc])
  }
  
  data
}

R相关问答推荐

卸载安装了BRM的模型发出的警告

在R中使用download. file().奇怪的URL?

如何调整曲线图中的y轴标签?

根据文本字符串中的值粘贴新列

使用rest从header(h2,h3,table)提取分层信息

您是否可以折叠R中的重复行,同时保留基于所选列的值?

用约翰逊分布进行均值比较

使用Scale_*_MANUAL时在图例中保留未使用的系数级别

Ggplot2中geom_tile的动态zoom

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

为左表中的所有行使用值Fill滚动左连接

使用不同的定性属性定制主成分分析中点的 colored颜色 和形状

在点图上绘制置信度或预测区间ggplot2

自定义交互作用图的标签

如何在AER::ivreg中指定仪器?

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

使用同一行中的前一个值填充R矩阵中的缺失值

将边列表转换为路径长度列表

了解nchar在列表上的意外行为

Data.table条件合并