31 个版本 (3 个稳定版)

1.0.5 2024年7月4日
1.0.2 2024年2月6日
1.0.0 2023年11月12日
0.2.37 2023年10月29日
0.2.23 2022年6月30日

#15 in 生物学

Download history 7/week @ 2024-04-22 9/week @ 2024-04-29 3/week @ 2024-05-06 14/week @ 2024-06-03 21/week @ 2024-06-10 13/week @ 2024-06-17 4/week @ 2024-06-24 461/week @ 2024-07-01 25/week @ 2024-07-08 140/week @ 2024-07-29

每月382次下载

Apache-2.0

2MB
35K SLoC

JavaScript 25K SLoC // 0.2% comments Rust 6K SLoC // 0.1% comments Python 4K SLoC // 0.3% comments Jupyter Notebooks 94 SLoC // 0.1% comments INI 6 SLoC Batch 1 SLoC

bed-reader

github crates.io docs.rs build status

简单高效地读取和写入PLINK BED格式。

亮点

  • 快速和多线程
  • 支持多种索引方法。按个体(样本)和/或SNPs(变体)切片数据。
  • 此库的Python API被PySnpToolsFaST-LMMPyStatGen使用。
  • 支持PLINK 1.9
  • 本地或从云中读取数据,高效且直接。

安装

完整版本:可以读取本地和云文件

cargo add bed-reader

最小版本:只能读取本地文件

cargo add bed-reader --no-default-features

示例

从.bed文件中读取所有基因型数据。

use ndarray as nd;
use bed_reader::{Bed, ReadOptions, assert_eq_nan, sample_bed_file};

let file_name = sample_bed_file("small.bed")?;
let mut bed = Bed::new(file_name)?;
let val = ReadOptions::builder().f64().read(&mut bed)?;

assert_eq_nan(
    &val,
    &nd::array![
        [1.0, 0.0, f64::NAN, 0.0],
        [2.0, 0.0, f64::NAN, 2.0],
        [0.0, 1.0, 2.0, 0.0]
    ],
);
# use bed_reader::BedErrorPlus; // '#' needed for doctest
# Ok::<(), Box<BedErrorPlus>>(())

读取每隔一个个体(样本)和SNPs(变体)20到30。

use ndarray::s;

let file_name = sample_bed_file("some_missing.bed")?;
let mut bed = Bed::new(file_name)?;
let val = ReadOptions::builder()
    .iid_index(s![..;2])
    .sid_index(20..30)
    .f64()
    .read(&mut bed)?;

assert!(val.dim() == (50, 10));
# use bed_reader::{Bed, ReadOptions, BedErrorPlus, assert_eq_nan, sample_bed_file}; // '#' needed for doctest
# Ok::<(), Box<BedErrorPlus>>(())

列出前5个个体(样本)ID,前5个SNPs(变体)ID,以及每个独特的染色体。然后,读取染色体5中的每个基因组值。

# use ndarray::s; // '#' needed for doctest
# use bed_reader::{Bed, ReadOptions, assert_eq_nan, sample_bed_file};
# let file_name = sample_bed_file("some_missing.bed")?;
use std::collections::HashSet;

let mut bed = Bed::new(file_name)?;
println!("{:?}", bed.iid()?.slice(s![..5])); // Outputs ndarray: ["iid_0", "iid_1", "iid_2", "iid_3", "iid_4"]
println!("{:?}", bed.sid()?.slice(s![..5])); // Outputs ndarray: ["sid_0", "sid_1", "sid_2", "sid_3", "sid_4"]
println!("{:?}", bed.chromosome()?.iter().collect::<HashSet<_>>());
// Outputs: {"12", "10", "4", "8", "19", "21", "9", "15", "6", "16", "13", "7", "17", "18", "1", "22", "11", "2", "20", "3", "5", "14"}
let val = ReadOptions::builder()
    .sid_index(bed.chromosome()?.map(|elem| elem == "5"))
    .f64()
    .read(&mut bed)?;

assert!(val.dim() == (100, 6));
# use bed_reader::BedErrorPlus; // '#' needed for doctest
# Ok::<(), Box<BedErrorPlus>>(())

从云中:打开文件并读取索引位置2的SNPs(变体)数据。(有关在云中指定文件的详细信息,请参阅"云URL和CloudFile示例"。)

use ndarray as nd;
use bed_reader::{assert_eq_nan, BedCloud, ReadOptions};
# #[cfg(feature = "tokio")] Runtime::new().unwrap().block_on(async { // '#' needed for doc test
let url = "https://raw.githubusercontent.com/fastlmm/bed-sample-files/main/small.bed";
let mut bed_cloud = BedCloud::new(url).await?;
let val = ReadOptions::builder().sid_index(2).f64().read_cloud(&mut bed_cloud).await?;
assert_eq_nan(&val, &nd::array![[f64::NAN], [f64::NAN], [2.0]]);
# Ok::<(), Box<dyn std::error::Error>>(()) }).unwrap();
# #[cfg(feature = "tokio")] use {tokio::runtime::Runtime, bed_reader::BedErrorPlus};

依赖项

~27–38MB
~549K SLoC