【问题标题】:R code to analyze genotyping data.用于分析基因分型数据的 R 代码。
【发布时间】:2023-03-20 08:27:01
【问题描述】:

我有这个数据框 (mydf)。我需要将 REF 和 ALT 列中的字母(DNA 字母)与列名(“A”、“T”、“G”、“C”)匹配,并将相应的数值粘贴在一起作为“REF,ALT”。但是,有些行在 TYPE 列中有“snp:+[0-9]”和“flat$”。现在对于“flat$”行,我想将对应“start”id的“snp:+ [0-9]”中的ALT值相加,然后将该ALT值再次粘贴为“REF,ALT”(REF值对于具有相同起始 ID 的“snp:+[0-9]”和“flat$”将是相同的)并获得如结果所示的输出。我怎样才能创建一个函数来做到这一点?

mydf<-structure(c("chr20:5363934", "chr5:8529759", "chr14:9620689", 
            "chr18:547375", "chr8:5952145", "chr14:8694382", "chr16:2530921", 
            "chr16:2530921", "chr16:2530921", "chr14:4214117", "chr4:7799768", 
            "chr3:9141263", "95", "24", "65", "94", "27", "68", "49", "49", 
            "49", "73", "36", "27", "29", " 1", "49", " 1", "80", "94", "15", 
            "15", "15", "49", "28", "41", "14", "28", "41", "51", "25", "26", 
            "79", "79", "79", "18", " 1", "93", "59", "41", "96", "67", "96", 
            "30", "72", "72", "72", "77", "16", "90", "C", "G", "T", "G", 
            "T", "A", "A", "A", "A", "G", "C", "A", "T", "C", "G", "C", "T", 
            "A", "T", "G", "T", "A", "A", "A", "snp", "snp", "snp", "snp", 
            "snp", "snp", "snp:2530921", "snp:2530921", "snp:flat", "snp", "snp", "snp"), .Dim = c(12L, 
                                                                                   8L), .Dimnames = list(NULL, c("start", "A", "T", "G", "C", "REF", 
                                                                                                                 "ALT", "TYPE")))

结果

    start              A    T    G    C    REF ALT TYPE       AD     
 [1,] "chr20:5363934" "95" "29" "14" "59" "C" "T" "snp"      "59,29"
 [2,] "chr5:8529759"  "24" " 1" "28" "41" "G" "C" "snp"      "28,41"
 [3,] "chr14:9620689" "65" "49" "41" "96" "T" "G" "snp"      "49,41"
 [4,] "chr18:547375"  "94" " 1" "51" "67" "G" "C" "snp"      "51,67"
 [5,] "chr8:5952145"  "27" "80" "25" "96" "T" "T" "snp"      "80,80"
 [6,] "chr14:8694382" "68" "94" "26" "30" "A" "A" "snp"      "68,68"
 [7,] "chr16:2530921" "49" "15" "79" "72" "A" "T" "snp:2530921" "49,15"
 [8,] "chr16:2530921" "49" "15" "79" "72" "A" "G" "snp:2530921" "49,79"
 [9,] "chr16:2530921" "49" "15" "79" "72" "A" "T" "snp:flat" "49,94"
[10,] "chr14:4214117" "73" "49" "18" "77" "G" "A" "snp"      "18,73"
[11,] "chr4:7799768"  "36" "28" " 1" "16" "C" "A" "snp"      "16,36"
[12,] "chr3:9141263"  "27" "41" "93" "90" "A" "A" "snp"      "27,27"

【问题讨论】:

  • flat 中基于snp[0-9] 的值的sum 不清楚。它必须与以前的值相邻吗?
  • 是的,总和是对应 snp[0-9] 的相邻值的总和。即具有相同起始 ID 的那些。
  • 所有具有相同起始 ID 的行的 ref 保持相同,但 flat 的 ALT 必须是具有相同起始 ID 的所有 snp 的组合(除了 flat 本身)。跨度>

标签: r bioinformatics


【解决方案1】:
indx <- sapply(mydf[,c("REF", "ALT")], function(x) match(x, colnames(mydf)))
flat <- grepl("flat", mydf[,"TYPE"])
x <- `dim<-`(mydf[cbind(rep(1:nrow(mydf), 2), indx)], c(nrow(mydf), 2))
add_ids <- mydf[,"start"][mydf[,"start"] %in% mydf[,"start"][flat] & !flat]
toadd <- x[,2][mydf[,"start"] %in% mydf[,"start"][flat] & !flat]
x[,2][flat] <-tapply(as.numeric(toadd), factor(add_ids, levels=unique(add_ids)), sum)
cbind(mydf, paste(x[,1], x[,2],sep=","))
#       start           A    T    G    C    REF ALT TYPE                 
#  [1,] "chr20:5363934" "95" "29" "14" "59" "C" "T" "snp"         "59,29"
#  [2,] "chr5:8529759"  "24" " 1" "28" "41" "G" "C" "snp"         "28,41"
#  [3,] "chr14:9620689" "65" "49" "41" "96" "T" "G" "snp"         "49,41"
#  [4,] "chr18:547375"  "94" " 1" "51" "67" "G" "C" "snp"         "51,67"
#  [5,] "chr8:5952145"  "27" "80" "25" "96" "T" "T" "snp"         "80,80"
#  [6,] "chr14:8694382" "68" "94" "26" "30" "A" "A" "snp"         "68,68"
#  [7,] "chr16:2530921" "49" "15" "79" "72" "A" "T" "snp:2530921" "49,15"
#  [8,] "chr16:2530921" "49" "15" "79" "72" "A" "G" "snp:2530921" "49,79"
#  [9,] "chr16:2530921" "49" "15" "79" "72" "A" "T" "snp:flat"    "49,94"
# [10,] "chr14:4214117" "73" "49" "18" "77" "G" "A" "snp"         "18,73"
# [11,] "chr4:7799768"  "36" "28" " 1" "16" "C" "A" "snp"         "16,36"
# [12,] "chr3:9141263"  "27" "41" "93" "90" "A" "A" "snp"         "27,27"

我们首先创建一个将 REF 和 ALT 匹配到正确列的索引。创建一个逻辑索引来定位其中包含“flat”的列。具有所有匹配项的数字向量被创建并给定维度。

要对 TYPE 为“flat”的 id 的值求和,我们首先确定与 id 匹配的行和值本身。然后将它们分配到适当的列槽,并将所有内容绑定在一起。

【讨论】:

  • 是的,它需要更多的工作。我必须更好地对“snp:flat”值进行分组。
  • 我在考虑v1 &lt;- mydf[cbind(rep(1:nrow(mydf), each=2), match(t(mydf[,c('REF', 'ALT')]), colnames(mydf)))];v2 &lt;- tapply(v1, as.numeric(gl(length(v1), 2, length(v1))), FUN=toString),然后替换flat的值
  • @user277653 你能试试我在 cmets 中发布的代码以及indx &lt;- grepl('flat', mydf[,'TYPE']);indx1 &lt;- grepl('snp:\\d+', mydf[,'TYPE']);v3 &lt;- sub(', .*', '', v2[indx1]);v4 &lt;- as.numeric(sub('.*,\\s+', '', v2[indx1]));v2[indx] &lt;- unique(paste(v3, ave(v4, v3, FUN=sum), sep=", "))
  • 我已经更新了答案,并在不同的组合上对其进行了测试。它适用于您提供的数据和其他迭代。如果您仍然遇到错误,则需要发布不同的示例。因为这些工作。
  • 这是一种将两个步骤合二为一的方法。而不是长版本,x &lt;- y; dim(x) &lt;- z 你可以做x &lt;- `dim&lt;-`(y,z)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
相关资源
最近更新 更多