按代码列将R中的多个data.tables排序为相同数量的data.tables,而不绑定data.tables(由于内存限制)

时间:2018-07-16 03:13:37

标签: r performance sorting data.table

我有很多包含大量数据的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,是最快的方法?预先感谢!

2 个答案:

答案 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,您会发现它已更改。如果您不希望出现这种情况,则可以考虑使用函数copyset(copy(x),....