簡體   English   中英

R中基因型的設計矩陣

[英]Design matrix for genotypes in R

我正在尋找一種有效的方法來為 R 中的基因型創建“參數化”設計矩陣。我有一個大文件(大約 3 gb),其中包含動物及其基因型。 示例數據如下所示:

snp id a1 a2 code
snp1 an1 A A 0
snp1 an2 A B 1
snp1 an3 B B -1
snp2 an1 A B 1
snp2 an2 A A 0
snp2 an3 B B -1

snp是snp的名字(每只動物都有一個snp),id是動物的id(每只動物都有唯一的id),a1是等位基因1,a2是等位基因2,code表示基於等位基因的基因型,如果動物有兩個A,它的代碼是0,如果動物有AB,它的代碼是-1,如果它是BB,代碼是1。

現在我需要根據該設計矩陣進行創建,該矩陣在行中將有動物(數據中的 id 列),在列中為 SNP(數據中的 snp 列)和“單元格”(在行和列的交叉處)我需要代碼列中的值。 所以最后,它應該是這樣的:

an1 0 1
an2 1 0
an3 -1 -1

我知道在效率和速度的情況下,R 有限制,但是,我仍然需要在 R 中可以獲得的最快解決方案。

通常 data.table 包在這些類型的情況下性能非常好。 下面的例子:

library(data.table)
#> Warning: package 'data.table' was built under R version 4.1.1

df <- fread(text = "snp id a1 a2 code
snp1 an1 A A 0
snp1 an2 A B 1
snp1 an3 B B -1
snp2 an1 A B 1
snp2 an2 A A 0
snp2 an3 B B -1")

dcast(df, id ~ snp, value.var = "code")
#>     id snp1 snp2
#> 1: an1    0    1
#> 2: an2    1    0
#> 3: an3   -1   -1

reprex 包(v2.0.1) 於 2021 年 10 月 13 日創建

如果您需要將輸出作為矩陣,您可以使用:

cast <- dcast(df, id ~ snp, value.var = "code")
mat <- as.matrix(cast[, -"id"])
rownames(mat) <- cast$id
mat
#>     snp1 snp2
#> an1    0    1
#> an2    1    0
#> an3   -1   -1

對於 ~3Gb 文件,您可能希望它運行大約 10 秒:

library(data.table)
#> Warning: package 'data.table' was built under R version 4.1.1

# Setting up larger data
df <- expand.grid(
  snp = paste0("snp", 1:10000),
  id  = paste0("an", 1:10000)
)
df$a1 <- sample(c("A", "B"), nrow(df), replace = TRUE)
df$a2 <- sample(c("A", "B"), nrow(df), replace = TRUE)
df$code <- with(df, dplyr::case_when(
  a1 == "A" & a2 == "A" ~ 0,
  a1 == "B" & a2 == "B" ~ -1,
  TRUE ~ 1
))
setDT(df)

# How big is this data?
format(object.size(df), "Gb")
#> [1] "3 Gb"

# How fast does the function run?
bench::mark(
  dcast(df, id ~ snp, value.var = "code")
)
#> Warning: Some expressions had a GC in every iteration; so filtering is disabled.
#> # A tibble: 1 x 6
#>   expression                                   min   median `itr/sec` mem_alloc
#>   <bch:expr>                              <bch:tm> <bch:tm>     <dbl> <bch:byt>
#> 1 dcast(df, id ~ snp, value.var = "code")    9.32s    9.32s     0.107    6.71GB
#> # ... with 1 more variable: gc/sec <dbl>

reprex 包(v2.0.1) 於 2021 年 10 月 13 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM