这个问题是我之前的帖子中更基本的问题。
我想了解如何在以下场景中最有效地处理数据:我有许多具有相同列名的大型(25-80GB).csv 数据集(随着时间的推移跟随一些单位)并且我在 R 中工作。我使用过之前的 {arrow} 和 {duckdb} 的组合(请参阅较早的帖子),但我对其他解决方案持开放态度,例如单独使用 {duckdb} 。也非常欢迎了解更多有关建议方法的资源。所需的操作将包括根据给定列中某个字符串的出现情况过滤数据(例如,“book_author”列中的字符串“Lewis”)、折叠(例如,个人 X 在 Y 年预订了 3 本书 Lewis 书籍),最后使用 rbind() 处理多个现已清理的数据集。
数据清理结束后,文件应该可以在 data.table 中进行管理。
提前非常感谢。
awk 或 grep,一种可能的选择是在将数据加载到 R 之前过滤“内存不足”的数据。
例如有两个示例 csv 文件(test1.csv 和 test2.csv):“test1.csv”:
A,B,C,D
1,2,3,4
5,6,7,8
“test2.csv”:
A,B,C,D
11,22,33,44
55,66,77,88
从 R 内部:
library(data.table)
dt <- fread(cmd = "awk 'BEGIN{FS=\",\"} $2 ~ \"2\"' ~/Desktop/test*.csv")
dt
#> V1 V2 V3 V4
#> <int> <int> <int> <int>
#> 1: 1 2 3 4
#> 2: 11 22 33 44
dt2 <- fread(cmd = "grep -h \"2\" ~/Desktop/test*.csv")
dt2
#> V1 V2 V3 V4
#> <int> <int> <int> <int>
#> 1: 1 2 3 4
#> 2: 11 22 33 44
创建于 2024-12-03,使用 reprex v2.1.0
awk
命令选择第 2 列中包含“2”的行(每个文件中的一个),
grep
命令选择任何列中包含“2”的行(同样,从每个文件中选择一行)每个文件)。您很可能可以使用
awk
处理“个人 X 在 Y 年预订了 3 本书 Lewis 书籍”,但我需要更多详细信息才能在命令中包含此“折叠”(即示例输入和输出)。注意。此方法假设您的过滤充分减小了结果数据集的大小(即,在选择感兴趣的行后,它适合 RAM),并且您已安装
awk
或
grep
。