我有很多包含大量数据的CSV,这些数据未按集中所有CSV的代码排序。我想对整个代码集进行排序,将代码保存到CSV集中,并保持与未排序时相同的CSV数量。 我无法像通常那样将它们绑定,排序和拆分,因为由于内存限制,不得不将CSV分隔开。我的实际数据集是数十亿行,分布在数百个CSV中像这样。
例如,如果在读取以下每个数据表示例之后:
可复制的数据:
###Really I would fread() each of these, but reproducible here
data1 <- data.table(code=rep(c(1:2000),times=500),
data1=rep(c(10001:12000),times=500),
data2=rep(c(20001:22000),times=500))
data2 <- data.table(code=rep(c(1:2000),times=500),
data1=rep(c(10001:12000),times=500),
data2=rep(c(20001:22000),times=500))
data3 <- data.table(code=rep(c(1:2000),times=500),
data1=rep(c(10001:12000),times=500),
data2=rep(c(20001:22000),times=500))
data4 <- data.table(code=rep(c(1:2000),times=500),
data1=rep(c(10001:12000),times=500),
data2=rep(c(20001:22000),times=500))
我想按代码对每个数据进行排序(实际上有一个可变数字),并保存为相同数量的CSV
以下是我想要的格式的上述数据的示例。因此,原始数据表上存在代码1-2000,在这里代码被拆分,因此代码1:500在期望1上,代码501:1000在期望2上,代码1001:1500在期望3上,代码1501:2000在在期望4上。
可复制的所需数据:
###I'd use fwrite to save each one of these as a csv to file
desired1 <- data.table(code=rep(c(1:500),times=2000),
data1=rep(c(10001:10500),times=2000),
data2=rep(c(20001:20500),times=2000))
desired2 <- data.table(code=rep(c(501:1000),times=2000),
data1=rep(c(10501:11000),times=2000),
data2=rep(c(20501:21000),times=2000))
desired3 <- data.table(code=rep(c(1001:1500),times=2000),
data1=rep(c(11001:11500),times=2000),
data2=rep(c(21001:21500),times=2000))
desired4 <- data.table(code=rep(c(1501:2000),times=2000),
data1=rep(c(11501:12000),times=2000),
data2=rep(c(21501:22000),times=2000))
实际上,我有500或更多CSV。什么是最快的排序方式,然后将所有相同的代码保存到同一csv,同时仍然拆分成与原始未排序文件相同数量的csv,是最快的方法?预先感谢!
答案 0 :(得分:1)
依次for
的{{1}}循环将提高内存效率
rbind
答案 1 :(得分:0)
mm = function(x){
a = table(x)
rep(1:unique(a),length(a))
}
Map(function(x,y)set(x,j="code",value=mm(x[,code])+y),mget(ls(pattern = "data")),c(0,500,1000,1500))
$data4
code data1 data2
1: 1501 10001 20001
2: 1502 10002 20002
3: 1503 10003 20003
4: 1504 10004 20004
5: 1505 10005 20005
---
999996: 1996 11996 21996
999997: 1997 11997 21997
999998: 1998 11998 21998
999999: 1999 11999 21999
1000000: 2000 12000 22000
这将更改按引用调用的原始数据。即尝试调用data2
,您会发现它已更改。如果您不希望出现这种情况,则可以考虑使用函数copy
即set(copy(x),....