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

如何用for循环将企业数据按每50条分配至不同基金数据集?

企业按批次分配至不同基金的实现方法

原代码的问题分析

你的代码未达预期主要有三个原因:

  • 循环中每次直接覆盖Fund变量,导致仅保留最后一次循环的结果,而非累积所有分组
  • 索引范围错误:i:(i+50)会选取51家企业(例如i=1时是1到51),不符合每50家一组的要求
  • 不必要使用subset函数,直接通过索引切片即可完成数据提取

修正后的for循环实现

以下是调整后的代码,能正确将2000家企业按每50家一组分配到对应基金列表:

# 初始化空列表用于存储各基金的企业数据
Fund <- list()

# 按每50家为一组循环,覆盖全部2000家企业
for (i in seq(1, 2000, 50)) {
  # 计算当前组的结束索引,避免超出数据集范围(鲁棒性处理)
  end_idx <- min(i + 49, 2000)
  # 将当前组数据添加到列表,自动命名为fund1、fund2...
  Fund[[paste0("fund", (i %/% 50) + 1)]] <- artif_company[, i:end_idx]
}

借助tidyquant/tidyverse的简化实现

tidyquant依赖tidyverse生态,可通过分组拆分的方式更简洁地完成需求。注意:若你的数据集是列代表企业,需先转置为行结构(tidyverse更适配行式数据):

library(tidyquant)

# 处理列代表企业的情况:转置+添加企业ID+生成基金分组
artif_company_processed <- artif_company %>%
  t() %>%
  as.data.frame() %>%
  rownames_to_column("company_id") %>%
  mutate(fund = paste0("fund", ceiling(row_number() / 50)))

# 按基金分组拆分为列表,并命名
Fund_list <- artif_company_processed %>%
  group_split(fund, .keep = FALSE) %>%
  set_names(paste0("fund", 1:40))

如果你的数据集是行代表企业(更常见的结构),代码可进一步简化:

library(tidyquant)

# 添加基金分组列
artif_company_with_fund <- artif_company %>%
  mutate(fund = paste0("fund", ceiling(row_number() / 50)))

# 拆分并命名
Fund_list <- artif_company_with_fund %>%
  group_split(fund, .keep = FALSE) %>%
  set_names(paste0("fund", 1:40))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:45:32