0

我有一个令人费解的问题,我希望我能简单地解释一下......

我有以下数据:

CHROM   POS      REF    SNP          INDEL  
5       290      A      --|T|--|--   0  
5       890      A      A|T|--|G     0  
7       672      A      A|--|C|--    +C,+CC     
9       459      G      A|T|--|G     -C     

我想创建一个 ALT 变量,以便最终可以通过 VCFtools 运行它。但是,当且仅当满足某个语句时,我不完全确定如何通过不断添加变量来创建变量。

例如:

第一列很简单,ALT只有T;但是我只想在 ALT 列中粘贴 T,而不添加“|” 或者 ” - ”。第二个略有不同,我不想将 A 添加到 ALT 变量中,只是因为它在 SNP 条目下可见,而是添加了 T 和 G,由一列分隔。

所以本质上,我只想将每个字母添加到 ALT 变量中,前提是它不等于 REF 变量并且它不等于“--”。

我已经将 SNP 列拆分如下:

m$A <- sapply(strsplit(as.character(mito$SNP),"\\|"),function(x) x[1])
m$T <- sapply(strsplit(as.character(mito$SNP),"\\|"),function(x) x[2])
m$C <- sapply(strsplit(as.character(mito$SNP),"\\|"),function(x) x[3])
m$G <- sapply(strsplit(as.character(mito$SNP),"\\|"),function(x) x[4])

但是从这里有点卡住了。我也有“+C,+CC”和“-C”的问题......对于这些,SNP列中的字母被忽略但REF和ALT变为:“A”和“AC,ACC”和分别为“GC”和“G”。我也把它分开了:

m$indel1 <- sapply(strsplit(as.character(mito$INDEL),","),function(x) x[1])
m$indel2 <- sapply(strsplit(as.character(mito$INDEL),","),function(x) x[2])

如果这真的没有意义;这是我希望不同的选项:

CHROM   POS      REF    SNP          INDEL    ALT
5       290      A      --|T|--|--   0        T 
5       890      A      A|T|--|G     0        T,G   
7       672      A      A|--|C|--    +C,+CC   AC,ACC    
9       459      GC     A|T|--|G     -C       G

我只包含了上面的例子,但文件中有所有不同的组合。这可以在 R 中完成,还是会变得非常复杂。

提前谢谢...

注1:

首先,如果我在上面的查询中不清楚这一点,我们深表歉意。并感谢那些迄今为止提供帮助的人。根据要求,INDEL 的 ALT 变量将根据 INDEL 前面是否有“-”号或“+”号而改变(即,这不会遵循与 SNP 相同的规则,后者将是大多数行)。

例如:

  1. “-C”(或任何有“-”符号的地方),如上所述,REF 需要变为 REF+INDEL,ALT 变为 REF(如果需要,用逗号分隔):

    CHROM   POS      REF    SNP          INDEL    ALT   
    9       459      GC     A|T|--|G     -C       G
    
  2. 如果有“+”号(无论是 +C、+CC 还是 +GGG 或其他),REF 保持不变,但 ALT 变为 REF+INDEL(如果需要,用逗号分隔):

    CHROM   POS      REF    SNP          INDEL    ALT
    7       672      A      A|--|C|--    +C,+CC   AC,ACC    
    9       987      T      --|T|C|--    +GGG     TGGG
    
4

3 回答 3

2

对于我对您的数据框所做的任意推断,我尝试了一些有点幼稚的东西 - 并且可能不是那么有效。当然,如果我在任何地方弄错了,它是可以改变的。无论如何,我希望它会有所帮助。

#> DF
#   CHROM POS REF        SNP  INDEL
#1      5 290   A --|T|--|--      0
#2      5 890   A   A|T|--|G      0
#3      7 672   A  A|--|C|-- +C,+CC
#4      9 459   G   A|T|--|G     -C
#5      3 554   T   A|T|--|G -GG,-A
#6      9 987   T  --|T|C|--   +GGG
#7     21 214   G   A|T|--|G      0
#8      1 145   G  G|--|--|G      0
#9      3 554 T,C   A|T|--|G -GG,-A
#10     7 672 A,T  A|--|C|-- +C,+CC

我认为解决方案是:

ff = function(xrow) {
   ref   = as.character(xrow[3])
   snp   = as.character(xrow[4])
   indel = as.character(xrow[5])

   if(indel == "0") {
      alt = gsub(paste(ref, "|\\||--", sep = ""), "", snp)
      if(nchar(alt) > 1) 
             alt = paste(strsplit(alt, "", fixed = T)[[1]], collapse = ",")
   }
   else {
      indels = strsplit(indel, ",", fixed = T)[[1]]

      if(grepl("-", indels[1], fixed = T)) {
        alt = ref
        ref = paste0(strsplit(ref, ",", fixed = T)[[1]], 
                        gsub("-", "", indels, fixed = T), collapse = ",")
      }
      if(grepl("+", indels[1], fixed = T)) {
        alt = paste0(strsplit(ref, ",", fixed = T)[[1]], 
                        gsub("+", "", indels, fixed = T), collapse = ",")
      }
  }    

   return(cbind(CHROM = xrow[1], POS = xrow[2], REF = ref, 
                SNP = snp, INDEL = indel, ALT = alt))
}
as.data.frame(t(apply(DF, 1, ff)))
#   V1  V2     V3         V4     V5     V6
#1   5 290      A --|T|--|--      0      T
#2   5 890      A   A|T|--|G      0    T,G
#3   7 672      A  A|--|C|-- +C,+CC AC,ACC
#4   9 459     GC   A|T|--|G     -C      G
#5   3 554 TGG,TA   A|T|--|G -GG,-A      T
#6   9 987      T  --|T|C|--   +GGG   TGGG
#7  21 214      G   A|T|--|G      0    A,T
#8   1 145      G  G|--|--|G      0       
#9   3 554 TGG,CA   A|T|--|G -GG,-A    T,C
#10  7 672    A,T  A|--|C|-- +C,+CC AC,TCC

DF

structure(list(CHROM = c("5", "5", "7", "9", "3", "9", "21", 
"1", "3", "7"), POS = c("290", "890", "672", "459", "554", "987", 
"214", "145", "554", "672"), REF = c("A", "A", "A", "G", "T", 
"T", "G", "G", "T,C", "A,T"), SNP = c("--|T|--|--", "A|T|--|G", 
"A|--|C|--", "A|T|--|G", "A|T|--|G", "--|T|C|--", "A|T|--|G", 
"G|--|--|G", "A|T|--|G", "A|--|C|--"), INDEL = c("0", "0", "+C,+CC", 
"-C", "-GG,-A", "+GGG", "0", "0", "-GG,-A", "+C,+CC")), .Names = c("CHROM", 
"POS", "REF", "SNP", "INDEL"), row.names = c(NA, 10L), class = "data.frame")
于 2014-02-19T19:02:37.273 回答
1

对于逻辑的第一部分,这样的工作:

mito <- read.table(text="CHROM   POS      REF    SNP          INDEL  
5       290      A      --|T|--|--   0
5       890      A      A|T|--|G     0
7       672      A      A|--|C|--    +C,+CC
9       459      G      A|T|--|G     -C",header=TRUE,stringsAsFactors=FALSE)

仅当每个字母不等于 REF 变量且不等于 '--' 时,才将每个字母添加到 ALT 变量中”。

SNPlist <- strsplit(mito$SNP,"\\|")
output <- Map(function(x,y) x[x!=y & x!="--"] , SNPlist, mito$REF)
mito$alt <- sapply(output,paste,collapse=",")
mito

#  CHROM POS REF        SNP  INDEL alt
#1     5 290   A --|T|--|--      0   T
#2     5 890   A   A|T|--|G      0 T,G
#3     7 672   A  A|--|C|-- +C,+CC   C
#4     9 459   G   A|T|--|G     -C A,T
于 2014-02-19T00:28:40.757 回答
0

你可以试试这个:

library(stringr)
snp <- str_extract_all(string = df$SNP, pattern = "[[:alpha:]]")

snp2 <- mapply(FUN = function(x, y) x[x != y], x = snp, y = df$REF)

df$ALT <- lapply(snp2, function(x) paste(x, collapse = ","))

df$ALT[df$INDEL == "+C,+CC"] <- "AC,ACC"
df$ALT[df$INDEL == "-C"] <- "G"

df

#   CHROM POS REF        SNP  INDEL    ALT
# 1     5 290   A --|T|--|--      0      T
# 2     5 890   A   A|T|--|G      0    T,G
# 3     7 672   A  A|--|C|-- +C,+CC AC,ACC
# 4     9 459   G   A|T|--|G     -C      G
于 2014-02-19T00:29:09.883 回答