在这种情况下如何使用 rbindlist(data) 而不是 do.call(rbind, data)

How to use rbindlist(data) instead of do.call(rbind, data) in this case

library(dplyr)
library(data.table)
library(stringr)

test = c('a1b1', 'a2b2', 'a3b3')
result = rbind(c(1,1),
               c(2,2),
               c(3,3))
result
     [,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]    3    3
test2<-do.call(rbind,test %>% str_split('a'))
test3<-do.call(rbind,test2 %>% .[,2] %>% str_split('b'))
test3
     [,1] [,2]
[1,] "1"  "1" 
[2,] "2"  "2" 
[3,] "3"  "3" 
  1. do.call(rbind, data) 不等于 rbindlist(data) ? data.table::rbindlist 不工作。如果我想使用rbindlist,我该怎么办?
rbindlist(test %>% str_split('a'))
Error in rbindlist(test %>% str_split("a")) : 
  Item 1 of input is not a data.frame, data.table or list

如果您想使用与 rbindlist 类似的方法,那么您可以执行如下操作。本质上,您可以添加一个步骤来将列表中的每个项目变成 data.table(但需要先转置)。

library(dplyr)
library(data.table)
library(stringr)

test2 <- rbindlist(test %>% str_split("a") %>% lapply(., function(x)
  as.data.table(t(x))))

test3 <- rbindlist(as.matrix(test2) %>% .[,2] %>% str_split("b") %>% lapply(., function(x)
  as.data.table(t(x))))

输出

test3

   V1 V2
1:  1  1
2:  2  2
3:  3  3

如果您使用 tstrsplit 而不是 str_split,它们将已经是列而不是行,因此您可以使用 as.data.table 而不是 rbind 将它们组合在一起。

test = c('a1b1', 'a2b2', 'a3b3')

library(data.table)
as.data.table(tstrsplit(tstrsplit(test, 'a')[[2]], 'b'))
#>        V1     V2
#>    <char> <char>
#> 1:      1      1
#> 2:      2      2
#> 3:      3      3

reprex package (v2.0.1)

于 2022-02-17 创建

这会快得多,例如< 1 秒对 18 秒,如果向量有 10,000 个元素。

test = c('a1b1', 'a2b2', 'a3b3')

library(data.table)
library(stringr)
library(bench)

test <- sample(test, 1e5, TRUE)

mark(
tstrsplit = 
  as.data.table(tstrsplit(tstrsplit(test, 'a')[[2]], 'b'))
,
str_split = {
  test2 <- rbindlist(test %>% str_split("a") %>% lapply(., function(x)
  as.data.table(t(x))))
  
  rbindlist(as.matrix(test2) %>% .[,2] %>% str_split("b") %>% lapply(., function(x)
  as.data.table(t(x))))
}
)
#> Warning: Some expressions had a GC in every iteration; so filtering is disabled.
#> # A tibble: 2 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 tstrsplit   134.8ms  138.7ms    7.16      9.54MB     1.79
#> 2 str_split     18.8s    18.8s    0.0532    3.11GB     2.66

reprex package (v2.0.1)

于 2022-02-17 创建