代码之家  ›  专栏  ›  技术社区  ›  Neal Barsch

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

  •  3
  • Neal Barsch  · 技术社区  · 6 年前

    我有许多csv包含大量数据,这些数据没有通过集合中所有csv的代码进行排序。我想将整个代码集的代码排序,将代码组保存到csv中,并保持与未排序时相同的csv数量。 我不能像通常那样将它们绑定在一起、排序和拆分,因为由于内存限制,我必须将csv分开。 我真正的数据集是数以百计的csv像这样分割成数十亿行。

    例如,如果在fread之后,每个数据表的示例如下:

    可复制数据:

    ###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在Desired1上,代码501:1000在Desired2上,代码1001:1500在Desired3上,代码1501:2000在Desired4上。

    可重复的所需数据:

    ###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 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    for 按顺序循环 rbind 会节省内存

    out <- data1[code %in% 1:500]
    for(i in 2:4) out <- rbind(out, get(paste0('data', i))[code %in% 1:500])
    identical(out, desired1) 
    #[1] TRUE 
    
        2
  •  0
  •   Onyambu    6 年前
    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),....