如何在 R 中将具有大量行的大文件从长格式转换为宽格式?

How to convert huge file with huge number of rows from long to wide format in R?

我有一个数据框 ACC,如下所示:数据框显示 miRNA 和目标相互作用:

ACC:

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

我使用 mutatepivot_wider 将上面的长格式转换为更宽的格式。我使用以下代码片段进行转换:如果有交互,它将是 1 else 0

library(dplyr)
library(tidyr)

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

输出如下所示:

需要帮助:

上面的数据框只是一个小例子。我有一个包含 400639 行和两列的数据框。我的原始数据维度如下:

dim(originaldata)
[1] 400639      2

我无法在 Rstudio 中将我的原始数据从长格式转换为更宽格式。谁能告诉我如何将这么大的文件从长格式转换为更宽的格式,如上面给出的输出?

谢谢

我相信您正在寻找的是 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

数据

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 的问题。