gpt4 book ai didi

r - 行/列的最佳排序以减小 R data.frame 对象的大小

转载 作者:行者123 更新时间:2023-12-03 16:54:19 25 4
gpt4 key购买 nike

是否有好的方法或算法来确定行和列的最佳排序和排列,以最小化磁盘上 R data.frame 的文件大小?

考虑以下数据:

# Init
library(dplyr)
set.seed(12345)
n_rows <- 10e6

df_1 <- data.frame(
V1 = sample(1:10, n_rows, replace=TRUE),
V2 = sample(1:2, n_rows, replace=TRUE),
V3 = sample(1:100, n_rows, replace=TRUE),
V4 = sample(1:1000, n_rows, replace=TRUE),
V5 = sample(1:5, n_rows, replace=TRUE)
) %>% as_data_frame()

df_2 <- df_1 %>% arrange(
V2, V5, V1, V3, V4
)

df_3 <- df_2 %>% select(
V2, V5, V1, V3, V4
)

saveRDS(df_1, "temp_1.RDS")
saveRDS(df_2, "temp_2.RDS")
saveRDS(df_3, "temp_3.RDS")

输出文件大小为:

  • df_1/temp_1.RDS = 43,770 KB
  • df_2/temp_2.RDS = 10,091 KB
  • df_3/temp_3.RDS = 10,089 KB

在此设置中,我们观察到通过以合理的方式对行进行排序可以显着减小文件大小,并且可以通过在排列行后以“某种”方式对列进行排序来实现微小的减小。

是否有一种自动计算出列的最佳顺序和排列它们的最佳顺序的方法?该方法可能使用动态编程或其他方法,但我希望有一个 R 包可以立即使用。

一旦加载到内存中,预先安排的对象通常性能更高吗?我猜是因为做与预先安排的分组一致的事情。

编辑,出于兴趣,这是一个简单任务的一些计时结果:

# Do a process on a data.frame
process_func <- function(x){
x %>% group_by(
V2,V5,V1
) %>% summarise(
sum(V4),
sum(V3)
)
}

system.time(replicate(100, process_func(df_1)))
system.time(replicate(100, process_func(df_2)))
system.time(replicate(100, process_func(df_3)))

同样的任务需要(重复 100 次):

  • df_1 95 秒
  • df_2 上 47 秒
  • df_3 48 秒

最佳答案

作为一种很好的启发式方法,我会首先按不同值较少的列进行排序。更优化的解决方案将需要更多的计算时间,考虑到您的问题的规模,这将是困难的。

你可以这样做:

df_4 <- df_1 %>% 
arrange_at(., names(sort(sapply(., n_distinct))))

关于r - 行/列的最佳排序以减小 R data.frame 对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48982676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com