如何使用rxDataStep在xdf中创建新列,并使用RevoScaleR检查多个列

时间:2018-10-14 20:39:15

标签: revoscaler

对于我的一生,我无法弄清楚。我想创建一个新列,以指示该行的任何其他列中是否存在字符串。我正在尝试使其与RevoScaleR包rxDataStep一起使用,因为我必须使其在无法存储的大型数据集上工作。

使用到目前为止,RevoScaleR软件包提供的数据集,我所做的只是首先尝试在单列中进行字符串匹配:

myData <- data.frame(x = 1:100, y = rep(c("a", "b", "c", "d"), 25),
                 z = rnorm(100), w = runif(100))

findStr1 = function(data) {
  foundInRow = grepl('a', data$y)
  data$Str = foundInRow
  return(data)
}

findStr1(myData) # works as expected
rxDataStep(myData, transformFunc = findStr1) # no error

那很好。问题是当我更改find​​Str函数以尝试检查多个列时。我想对函数进行概括,以便可以在多个示例字符串c('q','a')中的多行中找到匹配项。我也很欣赏关于最有效方法的建议,但这不是这个问题的重点(我决定使用set操作intersect()确定行中的字符之间是否至少存在一个匹配项)和要匹配的目标字符串)。我修改了findStr函数,如下所示:

findStr2 = function(data) {
  foundInRow = apply(data, 1, function(row) {
    length(intersect(as.character(row), c('q','a'))) >= 1
  })
  data$Str = foundInRow
  return(data)
}

注意,此输出与findStr1(mydata)完全相同

findStr2(myData)

继续,检查...

 findStr2(myData) == findStr1(myData) 

...如果需要。现在,当我运行时:

rxDataStep(myData, transformFunc = findStr2)

我得到:

ERROR: The sample data set for the analysis has no variables.
Caught exception in file: CxAnalysis.cpp, line: 3848. ThreadID: 8952 
Rethrowing.
Caught exception in file: CxAnalysis.cpp, line: 5375. ThreadID: 8952 
Rethrowing.
Error in doTryCatch(return(expr), name, parentenv, handler) : 
  ERROR: The sample data set for the analysis has no variables.

我完全陷入了困境。不需要使用transformObjects参数,因为所有变量都在findStr2函数的范围内定义。我将不胜感激!

0 个答案:

没有答案