Как конвертировать огромный файл с огромным количеством строк из длинного в широкий формат в R? - PullRequest
1 голос
/ 12 октября 2019

У меня есть фрейм данных ACC, который выглядит следующим образом: Фрейм данных показывает взаимодействия miRNA и Target:

ACC:

  miRNAs        Targets
MIMAT0000075    HIF1A
MIMAT0000449    CXCR4
MIMAT0000421    CYP7A1
MIMAT0000279    STAT5A
MIMAT0000076    RASGRP1

Я преобразовал вышеупомянутый длинный формат в более широкий формат, используяmutate и pivot_wider. Я использовал следующий фрагмент для преобразования: если есть взаимодействие, оно будет 1 иначе 0

library(dplyr)
library(tidyr)

validated_targets <- ACC %>%
  mutate(n = 1) %>%
  pivot_wider(names_from = miRNAs, values_from = n, values_fill = list(n = 0))

Вывод будет выглядеть следующим образом:

enter image description here

Требуется помощь:

Приведенный выше кадр данных является лишь небольшим примером. У меня есть датафрейм с 400639 строк и двух столбцов. Размер моих исходных данных ниже:

dim(originaldata)
[1] 400639      2

Я не могу преобразовать мои исходные данные из длинного в более широкий формат в Rstudio. Может кто-нибудь, пожалуйста, скажите мне, как преобразовать такой огромный файл из длинного в более широкий формат, как вывод, приведенный выше?

thanq

1 Ответ

2 голосов
/ 12 октября 2019

Я думаю, что вы ищете 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, во-первых.

...