You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中通过循环运行模型、生成子集并为新数据集赋值列的问题

问题修正与解决方案

原代码的语法错误

你的代码存在几处语法和逻辑问题:

  1. glm函数的括号位置错误,family=binomial被误写在函数括号外,且用glm做变量名会覆盖原函数,不推荐
  2. assign函数语法错误:参数顺序颠倒,括号未正确闭合,正确格式是assign(变量名字符串, 赋值对象)
  3. 修改子集列后未重新赋值回全局变量,导致修改只在局部生效

修正后的循环代码

先加载你的数据集:

dat <- structure(list(ID = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
3, 3), A = c(1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0), B = c(0, 
0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1), C = c(1, 1, 1, 0, 
1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1), M = c(1, 2, 3, 4, 1, 2, 3, 
4, 5, 1, 2, 3, 4, 5, 6)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -15L))

修正后的循环代码:

n <- max(dat$M)
for (ii in 1:n) {
  # 拟合模型,用glm_model作为变量名避免冲突
  glm_model <- glm(A ~ B + C, data = dat, subset = (M == ii), family = binomial)
  # 提取M=ii的子集
  M_subset <- subset(dat, M == ii)
  # 给子集添加对应预测列
  M_subset[[paste0("ps_", ii)]] <- predict(glm_model, type = 'response')
  # 将修改后的子集赋值到全局环境的M_1、M_2...变量
  assign(paste0("M_", ii), M_subset)
}

执行后,你会得到M_1到M_6的子集变量,每个变量都包含对应的ps_i预测列,无需担心不同ID的M值数量不一致的问题,subset和assign会自动处理单条数据的情况。

更推荐的替代方案:用列表存储子集

创建大量零散变量不利于后续管理,推荐用列表统一存储所有子集:

# 按M值拆分数据集为列表
M_list <- split(dat, dat$M)
# 遍历列表,为每个子集添加预测列
M_list <- lapply(names(M_list), function(m_val) {
  subset_data <- M_list[[m_val]]
  glm_model <- glm(A ~ B + C, data = subset_data, family = binomial)
  subset_data[[paste0("ps_", m_val)]] <- predict(glm_model, type = 'response')
  subset_data
})
# 给列表命名,方便索引
names(M_list) <- paste0("M_", 1:max(dat$M))

# 提取子集示例:获取M=1的子集
M_list$M_1

内容的提问来源于stack exchange,提问作者Statistix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:17:47