【问题标题】:sapply() Returning Surprising Result - Rsapply() 返回令人惊讶的结果 - R
【发布时间】:2013-06-29 01:53:45
【问题描述】:

我正在使用 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)
                                    })

我希望代码能够正常工作,所以在这些行之后我可以这样做:

predict(models[1,], test_case)
predict(models[2,], test_case)
predict(models[3,], test_case)

但现在我不能这样做,因为 sapply 返回的不仅仅是模型...如果我执行 print(dim(models)) 它说模型有 30 行和 3 列??

编辑添加问题;

使用以下代码的建议效果很好,我可以进行 predict(models[[1]], test_case) 并且效果很好。如何返回/保存模型,以便使用创建它们的密钥访问它们?例如,使用 h1_scores 可能如下所示:

predict(models[[65]], test_case))

predict(models[[key==65]], test_case)

【问题讨论】:

  • 你能提供样本数据吗? train 引用自身。
  • 另外,你在sapply 中的函数(应该是lapply,根据@Señor O 的回答)可能应该是return 的东西。
  • 技术上 mod 将被返回,因为它是大括号的最后一行,但我同意最好明确提及返回的内容以提高可读性。
  • 好点 Thomas,我刚刚使用 sapply 命令添加了“return(mod)”行,它现在的工作方式与 lapply 相同。实际上我之前尝试过,但对 r 数据结构感到困惑,并试图使用模型 [1,] 访问结果,而实际上它是模型 [[1]]

标签: r function vector sapply


【解决方案1】:

您需要使用lapply 而不是sapply

sapply 过于简化了。试试:

lapply(ListOfData, function(X) lm(y~x, X))
sapply(ListOfData, function(X) lm(y~x, X))

我不知道确切的区别,但如果您希望sapply 的每个项目的输出都有可提取的部分(即Item$SubItem),您应该改用lapply

更新

回答您的下一个问题,您可以:

names(models) <- h1_lines
names(h1_lines) <- h1_lines ## Before lapply

然后打电话给他们

models[["65"]]

请记住在数字周围使用引号。作为旁注,用数字命名列表项并不总是最好的主意。解决方法可能是:

models[[which(h1_lines==65)]]

【讨论】:

  • 当所有值的长度相同时,sapply 会尝试使用 simplify2array
  • 讽刺的是 sapply 试图“简化”但返回的结果比 lapply 更复杂和“彻底”
  • senor o,效果很好,我在上面更新了一个后续问题
猜你喜欢
  • 2018-01-09
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多