[英]How Do I Create an Array in R from a Data Frame with 3 Columns?
我目前有一个包含三列的 dataframe,如下所示:
单核苷酸多态性 | 动物ID | 等位基因频率 |
---|---|---|
ARS-BFGL-BAC-10172 | 1 | 0.0 |
ARS-BFGL-BAC-1020 | 2 | 0.5 |
ARS-BFGL-BAC-10345 | 3 | 1.0 |
ARS-BFGL-BAC-10591 | 4 | 0.5 |
等等... | 等等... | 等等... |
对于每只动物,我有大约 777,000 个 SNP 及其相应的等位基因频率。 (准确地说,我对 52 只动物有 777,962 个 SNP,总共 40,454,024 次观察)。
基本上我需要创建一个包含这些数据的数组,以便我的行是 SNP,列是等位基因频率,数组的第三维是动物 ID。 所以总的来说,我需要我的尺寸是[777962 1 52]。 但是,对于我的生活,我无法弄清楚如何制作这个数组。 我已经尝试了 array 命令和 abind 命令,以及其他一些出于绝望的事情,但我没有任何运气。
这是一个比我更了解R的朋友最初向我建议的代码:
array = abind(df, along = 3)
但这给了我一个具有这些维度的数组: [40454024 2 1] 这是不对的。
以下是我尝试过的其他一些无效的方法:
array = array(data = df$`SNPname`, df$AlleleFrequency, df$`AnimalID`)
array = abind(data = df$`SNPname`, df$AlleleFrequency, df$`AnimalID`)
array = array(c(df$`SNPname`, df$AlleleFrequency), dim =c(df$`SNPname`, df$AlleleFrequency, df$`AnimalID`))
如果有人能帮助我指出正确的方向,我将永远感激不尽。 提前致谢!!
如果您的意思是您需要一个以三列为维度的 3d 数组,这意味着每个单元格/值都是一个计数。 为此,请使用xtabs
(或table
):
xtabs(~SNPname + AlleleFrequency + AnimalID, data = dat)
# , , AnimalID = 1
# AlleleFrequency
# SNPname 0 0.5 1
# ARS-BFGL-BAC-10172 1 0 0
# ARS-BFGL-BAC-1020 0 0 0
# ARS-BFGL-BAC-10345 0 0 0
# ARS-BFGL-BAC-10591 0 0 0
# , , AnimalID = 2
# AlleleFrequency
# SNPname 0 0.5 1
# ARS-BFGL-BAC-10172 0 0 0
# ARS-BFGL-BAC-1020 0 1 0
# ARS-BFGL-BAC-10345 0 0 0
# ARS-BFGL-BAC-10591 0 0 0
# , , AnimalID = 3
# AlleleFrequency
# SNPname 0 0.5 1
# ARS-BFGL-BAC-10172 0 0 0
# ARS-BFGL-BAC-1020 0 0 0
# ARS-BFGL-BAC-10345 0 0 1
# ARS-BFGL-BAC-10591 0 0 0
# , , AnimalID = 4
# AlleleFrequency
# SNPname 0 0.5 1
# ARS-BFGL-BAC-10172 0 0 0
# ARS-BFGL-BAC-1020 0 0 0
# ARS-BFGL-BAC-10345 0 0 0
# ARS-BFGL-BAC-10591 0 1 0
如果您的意思是您需要频率是每个单元格中的值而不是计数,那么虽然您可以为其创建一个 3d 数组,但它永远不会有超过 2d 的数据。 一种方法是使用tidyr::pivot_wider
:
tidyr::pivot_wider(dat, "SNPname", names_from = "AnimalID", values_from = "AlleleFrequency")
# # A tibble: 4 x 5
# SNPname `1` `2` `3` `4`
# <chr> <dbl> <dbl> <dbl> <dbl>
# 1 ARS-BFGL-BAC-10172 0 NA NA NA
# 2 ARS-BFGL-BAC-1020 NA 0.5 NA NA
# 3 ARS-BFGL-BAC-10345 NA NA 1 NA
# 4 ARS-BFGL-BAC-10591 NA NA NA 0.5
数据
dat <- structure(list(SNPname = c("ARS-BFGL-BAC-10172", "ARS-BFGL-BAC-1020", "ARS-BFGL-BAC-10345", "ARS-BFGL-BAC-10591"), AnimalID = 1:4, AlleleFrequency = c(0, 0.5, 1, 0.5)), class = "data.frame", row.names = c(NA, -4L))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.