对于我的一生,我无法弄清楚。我想创建一个新列,以指示该行的任何其他列中是否存在字符串。我正在尝试使其与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
那很好。问题是当我更改findStr函数以尝试检查多个列时。我想对函数进行概括,以便可以在多个示例字符串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函数的范围内定义。我将不胜感激!