Most efficient list to data.frame method?

后端 未结 2 1816
长发绾君心
长发绾君心 2020-11-27 13:25

Just had a conversation with coworkers about this, and we thought it\'d be worth seeing what people out in SO land had to say. Suppose I had a list with N elements, where e

2条回答
  •  无人及你
    2020-11-27 13:51

    This appears to need a data.table suggestion given that efficiency for large datasets is required. Notably setattr sets by reference and does not copy

    library(data.table)
    set.seed(21)
    n <- 1e6
    h <- list(x=rnorm(n), y=rnorm(n), z=rnorm(n))
    h <- c(h,h,h,h,h,h)
    tracemem(h)
    
    system.time({h <- as.data.table(h)
                setattr(h, 'names', make.names(names(h), unique=T))})
    

    as.data.table, however does make a copy.


    Edit - no copying version

    Using @MatthewDowle's suggestion setattr(h,'class','data.frame') which will convert to data.frame by reference (no copies)

    set.seed(21)
    n <- 1e6
    i <- list(x=rnorm(n), y=rnorm(n), z=rnorm(n))
    i <- c(i,i,i,i,i,i)
    tracemem(i)
    
    system.time({  
      setattr(i, 'class', 'data.frame')
      setattr(i, "row.names", c(NA_integer_,n))
    
      setattr(i, "names", make.names(names(i), unique=TRUE))
    
    })
    

提交回复
热议问题