我正在尝试使用准引用语法(quo
, exprs
,!!
等)以及该foreach
函数通过要在函数内部评估的表达式的命名列表(rxDataStep
特别是transforms
参数)来创建几个新变量。我收到以下错误:
Error in rxLinkTransformComponents(transforms = transforms, transformFunc = transformFunc, : 'transforms' must be of the form list(...)
我有一个数据集,其中包含许多变量,我需要对数转换才能执行进一步分析。我已经使用rx
“RevoScaleR”包中的功能大约三年了,完全错过了数据转换技术的“tidyverse”/管道方法。我偶尔会涉足这些工具,但更喜欢坚持使用上述rx
功能,因为我相对熟悉,而且到目前为止它们对我很有帮助。
作为 MWE:
所需库:
library(foreach)
library(rlang)
创建需要对数转换的变量。
vars <- foreach(i = 10:20, .combine = "cbind") %do% rnorm(10, i)
带有标识符和以上变量的数据框。
data_in <- data.frame(id = 1:10, vars)
创建对数转换变量表达式的对象;这将创建一个命名列表。
log_vars <- foreach(i = names(data_in[-1]), .final = function(x) set_names(x, paste0(names(data_in[-1]), "_log"))) %do%
expr(log10(!!sym(i)))
现在尝试将变量添加到现有数据框中。
data_out <- rxDataStep(inData = data_in, transforms = log_vars, transformObjects = list(log_vars = log_vars))
产生的错误如下:
Error in rxLinkTransformComponents(transforms = transforms, transformFunc = transformFunc, : 'transforms' must be of the form list(...)
我根本无法理解log_vars
定义为命名列表的错误。可以使用str
和进行检查typeof
。
我尝试了一种稍微不同的方式来定义新变量:
log_vars <- unlist(foreach(i = names(data_in[-1]), j = paste0(names(data_in[-1]), "_log")) %do%
exprs(!!j := log10(!!sym(i))))
unlist
鉴于已经exprs
提供了一个列表作为输出,我必须使用它。无论哪种方式,我都会遇到与以前相同的错误。
自然,我希望result.1_log, result.2_log
在数据框中插入 10 个名为 等的新变量。相反,我收到上述错误并且未创建新的数据框。
我怀疑这些rx
函数不喜欢使用准引号语法,但是,我以前在必须识别具有某些变量的 NA 值的主题时使用过它。这是使用 的rowSelection
参数完成的rxDataStep
。我确实意识到这rowSelection
需要一个单一的逻辑表达式,而transforms
需要一个命名的表达式列表。
任何帮助将不胜感激,因为这种类型的数据转换将在我的分析中再次跟上。我确实怀疑我根本不了解准引号语法的内部工作原理,或者列表的一般工作方式,但希望有一个简单的解决方法。
我正在使用 Microsoft R Open 3.4.3。
我的会话信息如下:
R Services Information:
Local R: C:\Program Files\Microsoft\ML Server\R_SERVER\
Version: 1.3.40517.1016
Operating System: Microsoft Windows 10.0.17134
CPU Count: 4
Physical Memory: 12169 MB, 6810 MB free
Virtual Memory: 14025 MB, 7984 MB free
Video controller[1]: Intel(R) HD Graphics 620
GPU[1]: Intel(R) HD Graphics Family
Video memory[1]: 1024 MB
Connected users: 1