首页 > 解决方案 > 将存储在列表中的数据框列中的向量传递给 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向量cd。由于无法将列表传递给 glm,我尝试取消列出c并将d它们提供给模型,但这最终只会为两者创建一个长向量cd,这意味着我收到此错误:

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)')

我觉得我的问题会缺少一个简单的解决方案,但我之前不必尝试将向量列表传递给模型。

提前致谢。

标签: rlistdataframevectorglm

解决方案


如果问题是从列表中创建一个 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??

推荐阅读