如何使用transmute处理R eval?

如何使用transmute处理R eval?,r,eval,R,Eval,我对R很陌生。我正在尝试将一些列聚合到一个新列。因为只有聚合列必须保存到DF,所以我使用transmute 因为列名可能不同,所以我尝试连接一些字符串来生成一段代码,然后使用parse和eval来处理这段代码 我把这篇文章放在一起是: transmute("aggr1" = as.numeric(val1) + as.numeric(val2), "aggr2" = as.numeric(val3) + as.numeric(val4)) 如果我制作一个这样的新数据帧,它可以完美地工作: da

我对R很陌生。我正在尝试将一些列聚合到一个新列。因为只有聚合列必须保存到DF,所以我使用transmute

因为列名可能不同,所以我尝试连接一些字符串来生成一段代码,然后使用parse和eval来处理这段代码

我把这篇文章放在一起是:

transmute("aggr1" = as.numeric(val1) + as.numeric(val2), "aggr2" = as.numeric(val3) + as.numeric(val4))
如果我制作一个这样的新数据帧,它可以完美地工作:

data_aggr <- df %>%
  transmute("aggr1" = as.numeric(val1) + as.numeric(val2), "aggr2" = as.numeric(val3) + as.numeric(val4))
然后我使用:

data_aggr <- df %>%
  eval(parse(text=composed))

我的解决方案可行吗。我做错了什么吗?

一般来说,你几乎不想在常规代码中使用
parse
eval
——事实上,它们的存在应该是一个警告,表明你在错误地思考问题。这些是用于低级R编程的专用工具,在分析代码中应该完全没有这些工具

首先,在您的代码中,可能导致混淆的原因是在列名周围使用双引号,因此您认为它们是字符串。事实并非如此!R默默地接受多个位置的字符串文本,而不是变量名,并将它们视为变量名

所以你的初始代码实际上相当于

transmute(aggr1 = as.numeric(val1) + as.numeric(val2), aggr2 = as.numeric(val3) + as.numeric(val4))
…没有引用,这种区别对于理解发生了什么至关重要


现在,如何推广这一点,以便您可以实际使用不同的列名(即计算值)?简而言之,您需要使用
在列名前面,并使用
:=
代替
=

使dplyr将列名解释为计算值,并使用
:=
而不是
=
防止R将值视为函数调用参数名(它绕过R限制,因为
!!x=y
在语法上无效)

例如:

prefix = 'aggr'
data_aggr = df %>%
  transmute(
    !! paste0(prefix, 1) := as.numeric(val1) + as.numeric(val2),
    !! paste0(prefix, 2) := as.numeric(val3) + as.numeric(val4)
  )
如何准确计算列名显然取决于您的具体问题


关于如何动态调用dplyr函数的详细信息,请参见vignette。

您到底想实现什么?如果您展示实际问题,我们可能会向您展示一种可行的方法。连接字符串以创建代码片段绝对是错误的做法!嗨,康拉德,我正在尝试对列进行聚合。用户可以选择(a)聚合列的新名称和(b)应该在聚合中的列。因此,如果csv中的用户给出例如aggr1、val1、val2,那么应该有一个新列aggr1,它是val1和val2的聚合。因为用户必须能够更改csv文件,所以我认为这是一种方法。
transmute(aggr1 = as.numeric(val1) + as.numeric(val2), aggr2 = as.numeric(val3) + as.numeric(val4))
prefix = 'aggr'
data_aggr = df %>%
  transmute(
    !! paste0(prefix, 1) := as.numeric(val1) + as.numeric(val2),
    !! paste0(prefix, 2) := as.numeric(val3) + as.numeric(val4)
  )