通过 R 中的 ID 从一个较大的数据帧创建多个较小的数据帧

create multiple smaller dataframes from a larger one by IDs in R

我有一个大数据框,其中包含将近 200 万个条目除以 11 列。我想通过按前两列过滤将数据库拆分为多个较小的数据库。我在这里举一个数据库的例子。

investor   asset    price    col4  col5   ecc 
44KL        TLSA     
451L        F
4639L       AAPL 
44KL        UBI 
44KL        F 

我想为每位与单一资产配对的投资者创建一个新的单一数据框。 这意味着我希望将投资者“44KL”分为三个不同的数据框,称为 TSLA、UBI 和 F。这必须适用于我数据集中的所有投资者。 我通过这样做尝试了并行方法: 我首先在数据库上使用 unique() 来创建 'investor_ids' 和 'asset_list' 然后我尝试了:

file_names <- investors %>%
  dplyr::filter(investor %in% investor_ids) %>%
  dplyr::filter(asset %in% asset_list) %>% 
  dplyr::arrange(investor) %>%
  dplyr::mutate(name = stringr::str_c("INV", investor, asset, num_trx, stat, sep = "_")) %>%
  purrr::pluck("name")

for_asset <- function(df) {   
  for(inv in investor){  
  for (ass in assets) {
    df <-  subset(df, subset = asset == ass)   
  }  
  }
}

 Parallel --------------------------------------------------------------

cl <- parallel::makeCluster(parallel::detectCores())
doParallel::registerDoParallel(cl)
tictoc::tic()
foreach::foreach(i = seq_along(file_names), .errorhandling = "pass") %dopar% {
  
  
   df <- for_asset(db_test)

  nm <- paste0("dev/test-data/investors-rdata-assetbased/", file_names[i], ".RData")
  save(df, file = nm)
  
}
time <- tictoc::toc()
parallel::stopCluster(cl)

但我最终得到了正确数量的数据帧,但它们都只是 NULL 值。 你能帮助我吗? 然后我想继续对新形成的 dfs 应用计算,所以我需要一些易于使用的东西。 我尝试使用 split,但我得到了一个我不知道如何处理的列表列表

你可以这样做:

dfs = split(df, df[c(1,2)], drop=TRUE)
purrr::walk(names(dfs), function(d) {
  readr::write_csv(dfs[[d]],paste0("dev/test-data/investors-rdata-assetbased/",d,".csv"))
})

到目前为止,更好的选择是将您的 df 设置为 data.table,即

library(data.table)
setDT(df)

然后使用 df[i,j,by=.(investor,asset)]

处理每个 investor/asset 子组