如何在 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
我使用 mutate
和 pivot_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
的问题。
我有一个数据框 ACC
,如下所示:数据框显示 miRNA 和目标相互作用:
ACC:
miRNAs Targets
MIMAT0000075 HIF1A
MIMAT0000449 CXCR4
MIMAT0000421 CYP7A1
MIMAT0000279 STAT5A
MIMAT0000076 RASGRP1
我使用 mutate
和 pivot_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
的问题。