【发布时间】:2019-05-03 12:34:29
【问题描述】:
我必须删除我的函数循环。这并不容易,因为我的数据结构很复杂,我不知道如何在其中使用 apply 系列。
首先,我有这个数据结构
列表
在这个列表中,我还有其他带有 TRAIN 和 TEST 的列表。最后,我在这些级别中有 data.frames。我使用 iris 数据集创建列表的 simul 数据。
data(iris)
head(iris)
iristest<-head(iris)
train<-list(iris,iris,iris)
test<-list(iristest,iristest,iristest)
list1<-list(train,test)
names(list1)<-c("train","test")
iris2<-iris
iris2[,1:4]<-iris[,1:4]+5
iristest2<-head(iris2)
train<-list(iris2,iris2,iris2)
test<-list(iristest2,iristest2,iristest2)
list2<-list(train,test)
names(list2)<-c("train","test")
flist<-list(list1,list2)
names(flist)<-c("iris","iris2")
现在,我创建了一个比我想应用列表的函数。
Kmax<-5
nd<-10
ks<-seq(from=1,to=Kmax,by=1)
kn<-seq(1:nd)
findKNN<-function(listdf,seeds){
indx<-1
outs<-matrix(0, nrow = 5*length(listdf[[1]]), ncol = 3)
for (i in seq_along(listdf[[1]])){
for (K in 1:5){
train<- as.data.frame(listdf$train[i])
test <- as.data.frame(listdf$test[i])
set.seed(seeds)
kpreds <- knn(train[,-ncol(train)],test[,-ncol(test)], train[,ncol(train)],k=K)
Ktable <-table(kpreds ,test[,ncol(test)])
outs[indx,1] <- (Ktable[1, 2] + Ktable[2, 1]) / sum(Ktable)
outs[indx,2] <- K
outs[indx,3] <- i
indx<-indx+1
}
}
outs<-data.frame(outs)
names(outs)<-c("error","K","I")
outs<-aggregate(error ~ K,outs, mean)
}
output<-lapply(flist,seeds=12345,findKNN)
但我不知道如何有效地运行此代码。
谢谢
【问题讨论】:
-
同意@Jet,它更多的是为了可读性而不是效率,但我仍然认为这是一个好主意。开始的地方是分解循环中发生的逻辑,然后如何用更多的 R 惯用代码替换 for 循环将更直观。