R代码挑战:检索匹配列中的值,并将它们与匹配行相加

R代码挑战:检索匹配列中的值,并将它们与匹配行相加,r,R,我在R中解决了一个问题。我包含了一个名为testa dput的数据帧。我需要将列ALT中的所有字母与列名称A、C、G、T、N匹配,并获得这些列中的相应值以及REF字母的值,然后得到结果ad。新代码完成了这项工作 但是,我需要扩展这段代码,以解决类型列末尾有平面的行的问题。对于具有平面的行,我需要将其开始id chr10:102053031与开始列中的其他id匹配。如果它们匹配,我需要将A、C、G、T、N列中ALT的相应值相加,并将其替换为平直线的ad.new列以及REF值 如果您运行dput和我

我在R中解决了一个问题。我包含了一个名为testa dput的数据帧。我需要将列ALT中的所有字母与列名称A、C、G、T、N匹配,并获得这些列中的相应值以及REF字母的值,然后得到结果ad。新代码完成了这项工作

但是,我需要扩展这段代码,以解决类型列末尾有平面的行的问题。对于具有平面的行,我需要将其开始id chr10:102053031与开始列中的其他id匹配。如果它们匹配,我需要将A、C、G、T、N列中ALT的相应值相加,并将其替换为平直线的ad.new列以及REF值

如果您运行dput和我的代码,您将能够理解它。基本上,我想匹配REF和ALT列中的字母,从A、C、G、T、N列中得到相应的值,并用逗号分隔REF和ALT列中的值。但是在本例中,对于平面线,我想将A列中的值与平面线的起始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=",")
预期结果

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

像这样的方法应该会奏效:

# 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"

你能解释一下这条平线的规则吗?如果A和G中的值没有在任何地方指定,为什么我要选择它们?A和G是第二行和最后一行中ALT列中的字母,与平线snp:102053031:flat in TYPE列的起始id chr10:102053031匹配。因此,平线应该有ALT值之和。”“开始”列是染色体数目和基因位置,而th扁平线基本上是开始列中与ID匹配的所有基因位置的总和。非常感谢。从技术上讲,平线的ALT列应该有A和G两个字母,它们位于其他两个匹配行中,因此我需要结果中的和,但在我们的遗传学要求中,我们只提到了最常见的一个或占主导地位的一个,在这种情况下是G。因此,它将始终是A列中的值和其他列中非零值最多的所有值的总和,按末尾分组?不总是A列。平线中的起始id与其他两行及其ALT字母ar A和G匹配,在本例中,它们的对应值分别为6和7。有许多扁平线,这些扁平线中的每一条都有多个其他匹配行,通常每个扁平行有两行。我想我需要一个函数来获取与flat line的起始id匹配的行的ALT字母及其对应的值,并最终将它们相加。谢谢,这是完成我需要的工作的最好方法!
# 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"