Я думаю, что вы ищете data.table
эквивалент pivot_wider
- dcast
:
library(data.table)
library(dplyr)
dt_wide <- dt %>%
mutate(n = 1) %>%
dcast(Targets ~ miRNAs, value.var = "n", fill = 0)
dt_wide
#> Targets MIMAT0000075 MIMAT0000076 MIMAT0000279 MIMAT0000421 MIMAT0000449
#> 1 CXCR4 0 0 0 0 1
#> 2 CYP7A1 0 0 0 1 0
#> 3 HIF1A 1 0 0 0 0
#> 4 RASGRP1 0 1 0 0 0
#> 5 STAT5A 0 0 1 0 0
data
dt <- fread("miRNAs Targets
MIMAT0000075 HIF1A
MIMAT0000449 CXCR4
MIMAT0000421 CYP7A1
MIMAT0000279 STAT5A
MIMAT0000076 RASGRP1")
dt
#> miRNAs Targets
#> 1: MIMAT0000075 HIF1A
#> 2: MIMAT0000449 CXCR4
#> 3: MIMAT0000421 CYP7A1
#> 4: MIMAT0000279 STAT5A
#> 5: MIMAT0000076 RASGRP1
сравнительный анализ
Функция data.table
должна быть быстрее. Итак, давайте попробуем, насколько это существенно изменится в этом случае и с данными того же размера, что и данные, описанные в вопросе:
# simulate data
dt_big <- data.table(
miRNAs = sample(dt$miRNAs, 400639, replace = TRUE),
Targets = sample(dt$Targets, 400639, replace = TRUE)
)
# create mock functions for easier benchmarking
dt_dcast <- function(x) {
dt %>%
mutate(n = 1) %>%
dcast(Targets ~ miRNAs, value.var = "n", fill = 0)
}
tidyr_pivot_wider <- function(variables) {
dt %>%
mutate(n = 1) %>%
pivot_wider(names_from = miRNAs, values_from = n, values_fill = list(n = 0))
}
bench::mark(
dt_dcast(dt_big),
tidyr_pivot_wider(dt_big),
check = FALSE
)
#> # A tibble: 2 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 dt_dcast(dt_big) 1.8ms 2ms 462. 973KB 10.5
#> 2 tidyr_pivot_wider(dt_big) 4.02ms 4.52ms 218. 826KB 13.5
Как видите, data.table
занимает меньше половинывремя для завершения задачи. Однако ни одна из этих функций на самом деле не занимает много времени при таком размере набора данных, и я немного удивлен, что у вас возникли проблемы с pivot_wider
, во-первых.