我有几(8)个大文件(每个1M行),具有相同的变量/格式,按年单独保存。我想使用R中的duckdb
数据库格式保存到单个表中。duck_read_csv()
命令很好地实现了这一点。
问题:这种方法没有表示年的变量,因此丢失了重复测量的趋势。我的DBI和SQL知识有限,所以可能有一种简单的方法来做到这一点,但我被困在这里(下面是演示问题的简单示例):
library(duckdb)
con <- dbConnect(duckdb())
# example year 1 data
data <- data.frame(id = 1:3, b = letters[1:3]) # year = 1
path <- tempfile(fileext = ".csv")
write.csv(data, path, row.names = FALSE)
# example year 2 data
data2 <- data.frame(id = 1:3, b = letters[4:6]) # year = 2
path2 <- tempfile(fileext = ".csv")
write.csv(data2, path2, row.names = FALSE)
duckdb_read_csv(con, "data", files = c(path, path2)) # data is appended
这将产生以下结果--数据是按行追加的,但我需要一个变量来表示“年份”:
dbReadTable(con, "data")
id b
1 1 a
2 2 b
3 3 c
4 1 d
5 2 e
6 3 f
有没有办法在这个过程中创建一个新的变量,或者更好的方法是为
2条答案
按热度按时间yhxst69z1#
一种方法是使用
purrr::map_dfr
+readr::read_csv
进行读取,这允许您根据分配给文件路径的名称分配一个“id”列,然后将其注册为一个duckdb表:结果
h9a6wy2h2#
我修改了Jon的回答来解决我的问题(谢谢Jon)。文件太大,无法一次全部读取到内存中(每个文件大约2000万行),所以我每次迭代一个文件以传输到数据库(总共大约1.98亿行)。
我还使用
gsub
将文件名中的“年份”提取到一个单独的变量yrs
中。