gpt4 book ai didi

r - 在 R 中有效地重新格式化大型数据集中的列条目

转载 作者:行者123 更新时间:2023-12-04 12:31:44 25 4
gpt4 key购买 nike

我有一个大型(600 万行)值表,我认为需要对其进行重新格式化,然后才能将其用于与我的数据集进行比较。该表有我关心的 3 列。第一列包含核苷酸碱基变化,形式为 C>G、A>C、A>G 等。我想将它们分成两个单独的列。第二列有染色体和碱基位置,格式为 10:130448、2:40483、5:30821291 等。我也想把它分成两列。第三列包含多个样本群体中的等位基因部分,格式为 .02/.03/.20。我想将第三部分提取到一个新列中。

问题是我写的代码目前非常慢。看起来它需要大约一天半的时间才能运行。我在这里缺少什么吗?任何建议,将不胜感激。

我当前的代码执行以下操作:pos、change 和 fraction 分别接收上述值的向量 split 使用 strsplit。然后我遍历整个数据库,从这三个向量中获取第 i 个值,并使用我想要的值创建新列。

数据库格式化后,我应该可以轻松地通过染色体数、碱基、引用等位基因、替代等位基因等检查大量样本。

pos <- strsplit(total.esp$NCBI.Base, ":")
change <- strsplit(total.esp$Alleles, ">")
fraction <- strsplit(total.esp$'MAFinPercent(EA/AA/All)', "/")
for (i in 1:length(pos)){
current <- pos[[i]]
mutation <- change[[i]]
af <- fraction[[i]]
total.esp$chrom[i] <- current[1]
total.esp$base[i] <- current [2]
total.esp$ref[i] <- mutation[1]
total.esp$alt[i] <- mutation[2]
total.esp$af[i] <- af[3]

}

谢谢!

最佳答案

这是一个 data.table 解决方案。我们将 'data.frame' 转换为 'data.table' (setDT(df1)),用 循环 Data.table (.SD) 的子集>lapply,通过指定拆分字符使用 tstrsplitsplit 列,unlist 使用 recursive=FALSE 输出.

library(data.table)#v1.9.6+
setDT(df1)[, unlist(lapply(.SD, tstrsplit,
split='[>:/]', type.convert=TRUE), recursive=FALSE)]
# Alleles1 Alleles2 NCBI.Base1 NCBI.Base2 MAFinPercent1 MAFinPercent2
#1: C G 10 130448 0.02 0.03
#2: A C 2 40483 0.05 0.03
#3: A G 5 30821291 0.02 0.04
# MAFinPercent3
#1: 0.20
#2: 0.04
#3: 0.03

注意:我假设数据集中只有 3 列。如果有更多列,并且只想对 3 列进行拆分,我们可以指定 .SDcols= 1:3 即列索引或实际列名,赋值 (: =) 输出到新列,并将输出中仅需要的列子集化。

数据

df1 <- data.frame(Alleles =c('C>G', 'A>C', 'A>G'), 
NCBI.Base=c('10:130448', '2:40483', '5:30821291'),
MAFinPercent= c('.02/.03/.20', '.05/.03/.04', '.02/.04/.03'),
stringsAsFactors=FALSE)

关于r - 在 R 中有效地重新格式化大型数据集中的列条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32848288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com