【问题标题】:R code challenge: retrieving the values in matching columns and sum them up with matching rowsR 代码挑战:检索匹配列中的值并将它们与匹配的行相加
【发布时间】:2015-07-02 07:33:23
【问题描述】:

我在 R 中解决这个问题时遇到了问题。我有一个名为 testa 的数据框(包括 dput)。我需要将ALT 列中的所有字母与列名(A,C,G,T,N) 匹配,并获取这些列中的相应值以及REF 字母的值并得到结果ad.new(我的代码完成了这项工作)。

但是,我需要扩展此代码以解决TYPE 列末尾有flat 的行的问题。对于带有flat 的行,我需要将其起始ID (chr10:102053031) 与起始列中的其他ID 匹配。如果它们匹配,我需要从 A,C,G,T,N 列总结 ALT 的相应值,并将其替换为平线的 ad.new 列以及 REF 值。

如果您运行dput 和我的代码,您将能够理解它。所以基本上,我想匹配REFALT 列中的字母,并从列(A,C,G,T,N)中获取相应的值,并用逗号分隔REFALT 的这些值。但是(在本例中),对于flat 行,我想将A 列中的值与匹配的起始ID 与flat 行的起始ID 相加(本例中的值为6)和值与另一个匹配项(本例中的值是来自G 列的7)并将它们相加得到13。所以对于扁平线,我的结果应该是0,13

预期的结果也如下所示。

我的不完整代码:

testa[is.na(testa)]<-0 
ref.counts<-testa[,testa[,"REF"]]
ref.counts<-as.matrix(Ref.counts) 
ref.counts[is.na(Ref.counts)]<-0
ref.counts<-diag(Ref.counts)

alt.counts<-testa[,testa[,"ALT"]]
alt.counts<-as.matrix(alt.counts)
alt.counts[is.na(alt.counts)]<-0
alt.counts<-diag(alt.counts)

#############
##need to extend this code here
#############
ad.new<-paste(Ref.counts,alt.counts,sep=",")

测试的输入:

structure(c("chr10:101544447", "chr10:102053031", "chr10:102778767", 
"chr10:102789831", "chr10:102989480", "chr10:102053031", "chr10:102053031", 
"0", "6", "0", "0", "0", "0", "0", "0", "34", "24", "0", "0", 
"34", "34", "0", "0", "0", "0", "0", "0", "7", "53", "0", "0", 
"30", "12", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"chr10", "chr10", "chr10", "chr10", "chr10", "chr10", "chr10", 
"101544447", "102053031", "102778767", "102789831", "102989480", 
"102053031", "102053031", "A", "C", "C", "C", "C", "C", "C", 
"T", "A", "T", "T", "T", "G", "G", "snp", "snp", "snp", "snp", 
"snp", "snp:102053031:flat", "snp", "nonsynonymous SNV", 
"intronic", "nonsynonymous SNV", "nonsynonymous SNV", "ncRNA_exonic", 
"intronic", "intronic", "ABCC2:NM_000392:exon2:c.A116T:p.Y39F,", 
"PKD2L1", "PDZD7:NM_024895:exon8:c.G1136A:p.R379Q,PDZD7:NM_001195263:exon8:c.G1136A:p.R379Q,", 
"PDZD7:NM_024895:exon2:c.G146A:p.R49Q,PDZD7:NM_001195263:exon2:c.G146A:p.R49Q,", 
"LBX1-AS1", "PKD2L1", "PKD2L1"), .Dim = c(7L, 15L), .Dimnames = list(
    c("1", "2", "3", "4", "5", "6", "7"), c("start", "A", "C", 
    "G", "T", "N", "=", "-", "chr", "end", "REF", "ALT", "TYPE", 
    "refGene::location", "refGene::type")))

预期结果

 ad.new
"0,53"
"34,6"
"24,0"
"0,30"
"0,12"
"0,13" 
"34,7"

【问题讨论】:

  • 你能澄清一下扁平线的规则吗?如果“A”和“G”中的值没有在任何地方指定,我为什么要选择它们?
  • A 和 G 是 ALT 列中第 2 行和最后一行中的字母(与 TYPE 列中的平线 ("snp:102053031:flat") 的起始 id chr10:102053031 匹配的行) .所以扁线应该有 ALT 值的总和。 'start' 列是染色体编号和基因位置,平线基本上是所有基因位置的总和(匹配起始列中的 id)。谢谢!
  • 从技术上讲,扁线的 ALT 列应该同时包含其他两个匹配行中的 A 和 G 字母(因此我的结果中需要总和),但在我们的遗传学要求中,我们只提到最常见的(或主要的)在这种情况下是 G。
  • 所以它将始终是“A”列中的值与任何其他列中具有最多非零值的所有值的总和,按“end”分组?
  • 不总是 A 列。平线中的起始 id 与其他两行匹配,在这种情况下,它们的 ALT 字母 ar A 和 G 对应的值分别为 6 和 7。有许多扁平线,每条扁平线将有多个其他匹配的行(通常每个扁平行有两行)。我想我需要一个函数来获取与扁平线的起始 id 匹配的行的 ALT 字母及其对应的值,并最终将它们总结起来。

标签: r


【解决方案1】:

这样的事情应该可以工作:

# apply the "normal" rule (non considering flat exceptions)
alts <- as.numeric(diag(testa[,testa[,"ALT"]]))
refs <- as.numeric(diag(testa[,testa[,"REF"]]))
res <- paste(refs,alts,sep=",")

# replace lines having TYPE ending with "flat"
flats <- grep('.*flat$',testa[,"TYPE"])
res[flats] <- 
unlist(lapply(flats,function(x){
                startId <- testa[x,"start"]
                selection <- setdiff(which(testa[,"start"] == startId),r)
                paste0("0,",sum(alts[selection]))
             }))

ad.new <- as.matrix(res)
> ad.new
     [,1]  
[1,] "0,53"
[2,] "34,6"
[3,] "24,0"
[4,] "0,30"
[5,] "0,12"
[6,] "0,13"
[7,] "34,7"

【讨论】:

  • 谢谢,这是完成我需要的工作的最佳方式!
猜你喜欢
  • 2021-06-27
  • 2022-06-15
  • 2022-02-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2020-01-12
  • 2021-06-20
  • 2020-08-03
相关资源
最近更新 更多