r - 将存储在列表中的数据框列中的向量传递给 glm
问题描述
我正在尝试将泊松回归模型拟合到 R 中的数据集,由此我将不同长度的向量存储在两个列表中作为数据框列,如下所示:
test <- data.frame(a = 1:10, b = rnorm(10))
test$c <- list(length = nrow(test))
test$d <- list(length = nrow(test))
for(i in 1:nrow(test)) {
test$c[[i]] <- LETTERS[1:sample(10:11, 1)]
test$d[[i]] <- LETTERS[1:sample(10:11, 1)]
}
我需要建立一个模型来a
预测b
向量c
和d
。由于无法将列表传递给 glm,我尝试取消列出c
并将d
它们提供给模型,但这最终只会为两者创建一个长向量c
和d
,这意味着我收到此错误:
m0.glm <- glm(a ~ b + unlist(c) + unlist(d), data = test)
Error in model.frame.default(formula = a ~ b + unlist(c) + unlist(d), :
variable lengths differ (found for 'unlist(c)')
我觉得我的问题会缺少一个简单的解决方案,但我之前不必尝试将向量列表传递给模型。
提前致谢。
解决方案
如果问题是从列表中创建一个 df ,那么:
test <- data.frame(a = 1:10, b = rnorm(10))
test$c <- list(length(nrow(test)))
test$d <- list(length(nrow(test)))
for(i in 1:nrow(test)) {
test$c[[i]] <- LETTERS[1:sample(10:11, 1)]
test$d[[i]] <- LETTERS[1:sample(10:11, 1)]
}
#
do.call(rbind, lapply(test$c, function(x) {
res <- rep(NA, max(vapply(test$c, length, integer(1))))
res[1:length(x)] <- x
res
})) -> test_c_df
do.call(rbind, lapply(test$d, function(x) {
res <- rep(NA, max(vapply(test$d, length, integer(1))))
res[1:length(x)] <- x
res
})) -> test_d_df
test_new <- cbind(test[c("a", "b")], test_c_df, test_d_df)
names(test_new) <- make.unique(names(test_new))
m0.glm <- glm(a ~ ., data = test_new) # data reasonable??
推荐阅读
- oracle - 查询以搜索使用特定查找的所有包
- php - 代码在本地服务器上工作但在 Go-daddy 服务器上不起作用
- python - Python3:删除两个分隔字符之间的子字符串
- ios - 在 UITableViewController 的底部添加一个 ImageView
- node.js - 我可以在不使用/安装 node.js/npm 的情况下设置 Angular 6 吗?
- forms - 在 Google Apps 脚本 Web 应用程序表单中自动关闭
- python - 如何对使用 Flask 的 app.logger 的函数进行单元测试
- database - 规范覆盖后的候选键
- amazon-web-services - AWS hmac 加密差异
- javascript - JavaScript 将函数传递给 map();