R中的拆分,导出和读取数据集

时间:2016-08-27 00:55:12

标签: r

我有一个庞大的数据集,大约有100万行,其中许多对象都会进行各种测量。对每个对象重复每个测量。我的数据集看起来有点像这样:

ID    time    measuremment1    measurement2    measurement3   
1     5       12              324            123
1     6       123             654            45
1     3       346             556            548
2     2       234             345            253
2     8       35              998            316
2     17      515             1005           323 
2     50      156             155            616
3     10      555             985            575
3     219     515             358            741
3     300     548             555            953

依旧......

我使用R读取文件     read.csv

我想要做的是,拆分并可能根据我的对象ID将数据集导出到单独的csv文件中。换句话说,我想为每个对象提供单独的csv文件。另外,我想要重新读取R中的文件,因为我想执行计算。 我想这样做是一个迭代过程,在R中键入几行,这样可以节省我的时间。 有谁知道怎么做?

谢谢

2 个答案:

答案 0 :(得分:2)

<强>假设:

  1. 最初,您的所有数据都存储在一个大型文件中,并且您将其读入R中的大型数据框dat;
  2. dat已按ID排序。
  3. 我已经与你核实过这些条件是否满足。

    由于数据框的大小,我不建议使用split。相反,我建议 a&#34; read + write&#34;所有ID子集的迭代过程。我们可以在skip中使用nrowsread.csv参数来仅读取子集。

    我们首先确定每个ID的个案数量:

    x <- rle(dat$ID)  ## run length estimate
    k <- x$lengths  ## number of cases for each ID
    ID <- x$values  ## ID
    

    然后我们确定每个ID块开始的行:

    s <- c(0L, cumsum(k)) + 1L
    

    我们还存储此数据框的列名:

    NAMES <- colnames(dat)
    

    然后,我们从您的R会话中删除此大数据框dat,然后执行&#34; read + save&#34;所有ID块的迭代。

    rm(dat); gc()
    PATH <- getwd()
    
    for (i in seq_along(ID)) {
      ## read in the data subset for the current `ID`
      tmp <- read.csv("mydata.csv", skip = s[i], nrows = k[i], header = FALSE)
      ## `write.csv` does not allow `col.names`, so we use `write.table`
      write.table(tmp, file = paste0(PATH,"/",ID[i],".csv"), row.names = FALSE,
                  sep = ",", col.names = NAMES)
      }
    

    在每次迭代中,只有一个子集被读入R会话,因此大大减少了内存占用。您可能希望自定义文件路径PATH,因为目前所有文件都存储在您的工作总监getwd()中。

    让我们做一个小测试:

    ## example data frame
    dat <- data.frame(ID=rep(1:3,each=5), val=sample(15))
    NAMES <- colnames(dat)
    x <- rle(dat$ID)
    k <- x$lengths
    ID <- x$values
    s <- c(0L, cumsum(k)) + 1L
    
    ## store it into a csv file
    write.csv(dat, file = "mydata.csv", row.names = FALSE)
    
    ## iterative "read + write"
    PATH <- getwd()
    for (i in seq_along(ID)) {
      tmp <- read.csv("mydata.csv", skip = s[i], nrows = k[i], header = FALSE)
      write.table(tmp, file = paste0(PATH,"/",ID[i],".csv"), row.names = FALSE,
                  sep = ",", col.names = NAMES)
      }
    

    执行后,我看到三个文件:&#34; 1.csv&#34;,&#34; 2.csv&#34;和&#34; 3.csv&#34;在我的工作目录中,每个都有所需的数据。所以一切都很成功。

答案 1 :(得分:0)

我认为最简单快捷的方法是使用.csv

1st:将原始数据的子集保存到单独的library(data.table) set(df)[, fwrite(.SD, paste0("subset_", ID,".csv")), by = ID, .SDcols=names(df) ] 文件

.csv

第二:快速读取和绑定多个# identify .csv files in the folder filenames <- list.files( pattern=".csv", full.names=TRUE) # read and rbind files df <- rbindlist(lapply(filenames, fread)) 文件

{{1}}