app*_*ver 1 r function vector sapply
我正在使用glm()根据我制作的向量(h1_lines)中的值创建一些不同的模型.我希望sapply为向量中的每个值返回一个模型.相反,我的代码当前返回列表列表,其中列表的一部分是模型.它似乎正在返回我在sapply函数中所做的一切.
train = data.frame(scores=train[,y_col], total=train[,4], history=train[,5], line=train[,6])
h1_lines<- c(65, 70, 75)
models <- sapply(h1_lines, function(x){
temp_set<-train
temp_set$scores<-ifelse(temp_set$scores>x,1,
ifelse(temp_set$scores<x,0,rbinom(dim(temp_set)[1],1,.5)))
mod<-glm(scores ~ total + history + line, data=temp_set, family=binomial)
})
Run Code Online (Sandbox Code Playgroud)
我希望代码能够工作,所以在这些行之后我可以做到:
predict(models[1,], test_case)
predict(models[2,], test_case)
predict(models[3,], test_case)
Run Code Online (Sandbox Code Playgroud)
但是现在我不能这样做导致sapply返回的不仅仅是模型...如果我打印(昏暗(模型))它说模型有30行和3列?
编辑添加问题;
使用下面的建议代码工作得很好,我可以做预测(模型[[1]],test_case),它完美地工作.如何返回/保存模型,以便我可以使用我用来创建模型的密钥访问它们?例如,使用h1_scores可能类似于以下内容:
predict(models[[65]], test_case))
predict(models[[key==65]], test_case)
Run Code Online (Sandbox Code Playgroud)
你需要使用lapply而不是sapply.
sapply简化太多了.尝试:
lapply(ListOfData, function(X) lm(y~x, X))
sapply(ListOfData, function(X) lm(y~x, X))
Run Code Online (Sandbox Code Playgroud)
我不确切地知道这种区别,但是如果你期望每个项目的输出sapply都有可提取的部分(即Item$SubItem),你应该使用lapply.
更新
回答你的下一个问题,你可以做到:
names(models) <- h1_lines
names(h1_lines) <- h1_lines ## Before lapply
Run Code Online (Sandbox Code Playgroud)
然后打电话给他们
models[["65"]]
Run Code Online (Sandbox Code Playgroud)
请记住在数字周围使用引号.作为旁注,使用数字命名列表项并不总是最好的主意.解决方法可能是:
models[[which(h1_lines==65)]]
Run Code Online (Sandbox Code Playgroud)