通过 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 子组
我有一个大数据框,其中包含将近 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)]