【问题标题】:Design matrix for genotypes in RR中基因型的设计矩阵
【发布时间】:2021-12-01 21:21:39
【问题描述】:

我正在寻找一种有效的方法来为 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 中获得的最快解决方案。

【问题讨论】:

    标签: r matrix gwas


    【解决方案1】:

    通常 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 package (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 package (v2.0.1) 于 2021-10-13 创建

    【讨论】:

    • 感谢您的解决方案,它看起来真的很不错!我在我的数据上运行此代码并且我有一个问题/问题,当我运行它时,矩阵显示 1、2、3 而不是 -1、0、1,你知道原因可能是什么吗?
    • 听起来像是被编码为一个因子而不是一个数值,可能吗?
    • 嗯...在代码中,我将这个“代码”变量作为数字,所以我认为还有另一个原因。不过还是非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2011-06-01
    相关资源
    最近更新 更多