如何用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
相关产品推荐
相关产品推荐

