r - 如何在“扩展变换(R 语法)”节点中正确制作“modelerData”和“modelerDataModel”添加多个列
问题描述
我将 SPSS modeler v18.2.1 与 R v3.5.1(或 v3.3.3)一起使用,并使用 Essentials for R 18.2.1。
我正在尝试制作“扩展转换(R 语法)”节点来处理 SPSS 难以解决的一些问题(未来:使它们成为扩展包)。我希望他们添加多个列,创建新数据等并给出下一个节点data.frame
。但是data.frame
SPSS 节点错误地识别 (即,下一个表节点的输出与控制台输出不同print(modelerData)
)。
怎么做 ?(或者这是一个错误?)
任何帮助将不胜感激。下面是一个可重现的简单示例;
[准备R env和数据(请在纯R中进行)]
# if not installed
install.packages(randomForest)
set.seed(1) # to reproduce
write.csv(iris[sort(sample(1:150, 100)), ], "iris_train_seed1.csv", row.names = FALSE)
【扩展变换的R代码】
### library ###
library(randomForest)
# make_model
set.seed(1)
modelerModel <- randomForest(formula = Species ~ . ,
data = modelerData,
ntree = 100)
#### predict
pred_forest <- data.frame(pred = predict(modelerModel,
newdata = modelerData))
prob_forest <- as.data.frame(predict(modelerModel,
newdata = modelerData,
type = "prob"))
# overwriting modelerData
modelerData <- cbind(modelerData, pred_forest, prob_forest)
# function definition to make modelerDataModel
getMetaData <- function (data) {
if (dim(data)[1]<=0) {
print("Warning : modelerData has no line, all fieldStorage fields set to strings")
getStorage <- function(x){return("string")}
} else {
getStorage <- function(x) {
res <- NULL
#if x is a factor, typeof will return an integer so we treat the case on the side
if(is.factor(x)) {
res <- "string"
} else {
res <- switch(typeof(unlist(x)),
integer = "integer",
# integer = "real",
double = "real",
character = "string",
"string")
}
return (res)
}
}
col = vector("list", dim(data)[2])
for (i in 1:dim(data)[2]) {
col[[i]] <- c(fieldName=names(data[i]),
fieldLabel="",
fieldStorage=getStorage(data[[i]]),
fieldMeasure="",
fieldFormat="",
fieldRole="")
}
mdm<-do.call(cbind,col)
mdm<-data.frame(mdm)
return(mdm)
}
# overwriting modelerDataModel
modelerDataModel <- getMetaData(modelerData)
# to check
print(dim(modelerData))
print(head(modelerData))
print(dim(modelerDataModel))
print(modelerDataModel)
[“检查”部分的控制台输出(print(modelerData)
是我想要的表节点输出)]
# print(dim(modelerData))
[1] 100 9
# print(head(modelerData))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species pred setosa
1 4.9 3.0 1.4 0.2 setosa setosa 1
2 4.7 3.2 1.3 0.2 setosa setosa 1
3 5.0 3.6 1.4 0.2 setosa setosa 1
4 5.4 3.9 1.7 0.4 setosa setosa 1
5 4.6 3.4 1.4 0.3 setosa setosa 1
6 5.0 3.4 1.5 0.2 setosa setosa 1
versicolor virginica
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
6 0 0
# print(dim(modelerDataModel))
[1] 6 9
# print(modelerDataModel)
X1 X2 X3 X4 X5 X6
fieldName Sepal.Length Sepal.Width Petal.Length Petal.Width Species pred
fieldLabel
fieldStorage real real real real string string
fieldMeasure
fieldFormat
fieldRole
X7 X8 X9
fieldName setosa versicolor virginica
fieldLabel
fieldStorage real real real
fieldMeasure
fieldFormat
fieldRole
解决方案
这可能是因为您的Species
和pred
列的类型factor
不是character
并且查看 SPSS 节点文档,它们没有factor
.. 的类型。因为factor
有两个级别.. 输出表节点上的附加 2 列可能代表因子级别对于这两列,因为它试图强制字符串。您需要它们作为predict
脚本开头的函数的因子类型,但在导出表节点之前尝试:
modelerData[] <- lapply(modelerData, function(x) if (is.factor(x)) as.character(x) else {x})
我没有 SPSS 能够测试这个理论,但希望它能解决你的问题或让你更接近一点。
推荐阅读
- ios - 单击段控制表单元格内的按钮时无法执行 segue
- javascript - 柱形图水平刻度的透明背景
- apache-flink - 共享的检查点非常大
- jquery - Jquery - 多个下拉列表,禁用其他列表中的选定条目
- python - 如何使用 python 访问演示文稿的形状或文本运行中存在的 url?
- r - 在绘图前整理出小于 10 的计数
- ruby-on-rails - 我可以将现有的 Redis 用于自定义 Rails 缓存吗?
- c++ - 如何在类层次结构中传递智能指针
- ruby-on-rails - Rails (agile web development with rails 4th edition) 加载本地网站时出现问题,出现语法错误
- vb.net - 打印 Windows 窗体的特定区域