R 表格大表

R 表格大表,r,large-data,R,Large Data,我有一个巨大的表(数百万行和两列),类似于下面的表 字段1字段2 M01 ABC M02 ABC MO3 ABC M03 CDE M04 FGH M05 LMN M06 FGH FIELD1可能有数百万个唯一值,FIELD2可能有多达10000个唯一值。 我在R中使用以下语句读取txt文件并将其制成表格: dat<-read.table(file.choose(new = FALSE), sep = "\t") m=table(dat) dat此解决方案使用单个read.csv.sql

我有一个巨大的表(数百万行和两列),类似于下面的表

  • 字段1字段2
  • M01 ABC
  • M02 ABC
  • MO3 ABC
  • M03 CDE
  • M04 FGH
  • M05 LMN
  • M06 FGH
  • FIELD1可能有数百万个唯一值,FIELD2可能有多达10000个唯一值。 我在R中使用以下语句读取txt文件并将其制成表格:

    dat<-read.table(file.choose(new = FALSE), sep = "\t")
    m=table(dat)
    

    dat此解决方案使用单个
    read.csv.sql
    语句将数据读入SQLite数据库(它会自动创建),在数据库中执行计算(而不是在R中),然后仅在执行计算后将其读入R。因此,尽管它不做
    ,但它仍然显示哪些FIELD1值与每个FIELD2值关联,并通过更紧凑的表示方式来实现

    首先创建一些测试数据:

    # create test file
    test <- data.frame(FIELD1 = c("M01", "M02", "MO3", "M03", "M04", "M05", "M06"), 
        FIELD2 = c("ABC", "ABC", "ABC", "CDE", "FGH", "LMN", "FGH"))
    write.csv(test, file = "test.csv", row.names = FALSE, quote = FALSE)
    

    table
    将尝试通过
    length(unique(FIELD2))
    创建长度为
    的矩阵(unique(FIELD1))
    ,大概是原始数据大小的许多倍;一种更有效的表示方法是将计数作为数据帧,沿着

    lst <- with(test, lapply(split(as.character(FIELD1), FIELD2), table))
    df <- data.frame(FIELD1 = unlist(lapply(lst, names), use.names=FALSE), 
                    FIELD2 = rep(names(lst), sapply(lst, length)),
                    Count = unlist(lst, use.names=FALSE))
    

    您是否在
    read.table
    部分或
    table
    部分中得到错误?也就是说,在尝试将数据集制成表格之前,您是否成功地将数据集读入了R?的可能重复项也请查看bigmemory软件包。欢迎使用大数据。稍微有点奇怪,但如果您的示例准确,FIELD1可能存在数据清洁度问题。在第4行中,有
    MO3
    而不是
    M03
    。实际上我需要的是一个矩阵(Field1,Field2),我必须对它进行一些矩阵运算。我现在看到的唯一解决方案是一个向量接一个向量。矩阵包有一个稀疏的矩阵表示,这可能就足够了。
    >  DF
      FIELD2      FIELD1
    1    ABC M01,M02,MO3
    2    CDE         M03
    3    FGH     M04,M06
    4    LMN         M05
    
    lst <- with(test, lapply(split(as.character(FIELD1), FIELD2), table))
    df <- data.frame(FIELD1 = unlist(lapply(lst, names), use.names=FALSE), 
                    FIELD2 = rep(names(lst), sapply(lst, length)),
                    Count = unlist(lst, use.names=FALSE))
    
    library(Matrix)
    m <- with(df, {
        sparseMatrix(as.integer(FIELD1), as.integer(FIELD2), x=Count, 
                     dimnames=list(levels(FIELD1), levels(FIELD2)))
    })
    
    > m
    7 x 4 sparse Matrix of class "dgCMatrix"
        ABC CDE FGH LMN
    M01   1   .   .   .
    M02   1   .   .   .
    M03   .   1   .   .
    M04   .   .   1   .
    M05   .   .   .   1
    M06   .   .   1   .
    MO3   1   .   .   .
    
    > colSums(m)
    [1] 3 1 2 1