convert a data.table to a vector rowwise

前端 未结 1 533
被撕碎了的回忆
被撕碎了的回忆 2021-01-28 13:02

I have a data.table such as:

example <- data.table(fir =c(\"A\", \"B\", \"C\", \"A\",\"A\", \"B\", \"C\"), las=c( \"B\", \"C\",\"B\", \"C\", \"B\", \"C\",\"C\         


        
1条回答
  •  失恋的感觉
    2021-01-28 13:55

    As in a matrix as well as a data.frame/data.table (though different from a matrix), data is stored column wise, you can transpose it first:

    as.vector(t(example))
    # [1] "A" "B" "B" "C" "C" "B" "A" "C" "A" "B" "B" "C" "C" "C"
    

    A benchmark testing including options provided by @Sotos, @Frank and @Wen using a dummy data set:

    example <- as.data.table(matrix(sample(LETTERS, 10^7, replace = T), ncol = 1000))
    dim(example)
    #[1] 10000  1000
    
    library(microbenchmark)
    psidom <- function() as.vector(t(example))
    sotos <- function() c(t(example))
    frank <- function() unlist(transpose(example), use.names = FALSE)
    wen <- function() unname(unlist(data.frame(t(example))))
    
    # data.table 1.10.4
    microbenchmark(psidom(), sotos(), frank(), wen(), times = 10)
    
    #Unit: milliseconds
    #     expr       min        lq      mean    median        uq       max neval
    # psidom()  163.5993  178.9236  393.4838  198.6753  632.1086  1352.012    10
    #  sotos()  186.8764  188.3734  467.2117  343.1514  618.3121  1221.721    10
    #  frank() 3065.0988 3493.3691 5315.4451 4649.4643 5742.2399  9560.642    10
    #    wen() 7316.6743 8497.1409 9200.4397 9038.2834 9631.5313 11931.075    10
    

    Another test in data.table dev version 1.10.5:

    # data.table 1.10.5
    psidom <- function() as.vector(t(example))
    sotos <- function() c(t(example))
    frank <- function() unlist(transpose(example), use.names = FALSE)
    fast <- function() `attributes<-`(t(example), NULL)
    
    microbenchmark(psidom(), sotos(), frank(), fast(), times = 10)
    #Unit: milliseconds
    #     expr      min       lq     mean   median       uq      max neval
    # psidom() 228.1248 246.4666 271.6772 256.9131 287.5072 354.2053    10
    #  sotos() 254.3512 280.2504 315.3487 322.5726 344.7125 390.3482    10
    #  frank() 290.5476 310.7076 374.6267 349.8021 431.8451 491.9301    10
    #   fast() 159.6006 167.6316 209.8363 196.8821 272.4758 281.3146    10
    

    0 讨论(0)
提交回复
热议问题