我需要一些帮助来管理R中的几个SVM模型。我有大约100个数据文件,我想读取每个文件,然后使用e1071包训练该文件的模型。所有文件的名称都包含在一个文件中,因此更容易跟踪每个文件。我使用了以下代码但无法达到解决方案。
x<-read.table("data.dat", header=F)
x=as.vector(t(x))
vectory <- vector(mode="list", length=length(x))
vectorz <- vector(mode="list", length=length(x))
for (i in 1:length(x))
{
x[i] <- substr(x[i], 3, 100)
#assign(gsub("-", "_", x[i]), read.table(x[i], header=T, #sep=","))
val <- gsub("-", "_", x[i])
vectory[[val]] <- read.table(x[i], header=T, sep=",")
data(vectory[[val]])
valmodel <- x[i]
paste(valmodel, "_model", sep="")
vectorz[[valmodel]] <- ksvm(label ~ ., data=vectory[[val]])
}
我对调用ksvm函数时数据函数调用和数据参数到底需要做什么感到困惑。
此致
答案 0 :(得分:0)
正如斯科特所说,你的例子是不可复制的(而且这个问题并没有说清楚你的问题是什么)。我重写了你的代码,以免混淆。它未经测试,因此您可能需要进行调整。
file_names <- read.table("data.dat")[[1]]
file_names <- substring(file_names, 3)
file_names <- gsub("-", "_", file_names)
training_data <- lapply(
file_names,
read.table,
header = TRUE,
sep = ", "
)
svm_models <- lapply(
training_data,
function(data)
{
ksvm(label ~ ., data = data)
}
)
一般原则:
有意义地命名变量。调用文件名file_names
,而不是x
。
如果要循环列表(或向量),请使用lapply
(或来自llply
的{{1}}),而不是使用plyr
循环,因为这涉及额外的样板代码和创建虚拟变量。请注意您不再需要for
或vectory
。
将用于读取数据的代码与运行模型的代码分开。它们是不同的任务,将代码混杂在一起会混淆你的想法。 (此外,当一个模型失败时,您不希望再次读取数据。)