Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不断向给定不同if-else语句的字符串添加[R]_R_If Statement_Paste_Vcftools - Fatal编程技术网

不断向给定不同if-else语句的字符串添加[R]

不断向给定不同if-else语句的字符串添加[R],r,if-statement,paste,vcftools,R,If Statement,Paste,Vcftools,我有一个复杂的问题,我希望我能很容易地解释 我有以下数据: 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

我有一个复杂的问题,我希望我能很容易地解释

我有以下数据:

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变量且不等于“-”时,将每个字母添加到ALT变量中

我将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])
我只包含了上面的例子,但在文件中有所有不同的组合。这可以在R中完成,还是会变得非常复杂

提前谢谢你

注1:

首先,如果我在上面的问题中不清楚,请道歉。感谢那些迄今为止给予帮助的人。根据请求,根据INDEL前面是“-”号还是“+”号,INDEL的ALT变量将发生变化(即,这不会遵循与SNP相同的规则,SNP将是大多数行)

例如:

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

  • 如果有一个“+”符号(无论是+C、+CC或+GGG或其他符号),REF保持不变,但ALT变为REF+INDEL(必要时用逗号分隔):


  • 对于逻辑的第一部分,类似于这样的操作:

    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)
    

    mito对于逻辑的第一部分,类似这样的工作方式:

    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)
    

    mito对于逻辑的第一部分,类似这样的工作方式:

    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)
    

    mito对于逻辑的第一部分,类似这样的工作方式:

    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)
    
    mito您可以尝试以下方法:

    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
    
    库(stringr)
    snp您可以尝试以下方法:

    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
    
    库(stringr)
    snp您可以尝试以下方法:

    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
    
    库(stringr)
    snp您可以尝试以下方法:

    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
    
    库(stringr)
    
    snp我对你的数据帧做了一个任意的推断,我尝试了一些有点幼稚的东西——可能没有那么有效。当然,如果我有什么地方弄错了,可以改变。不管怎样,我希望这会有帮助

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

    我尝试了一些有点幼稚的东西——可能不是那么有效——对您的数据帧进行了任意推断。当然,如果我有什么地方弄错了,可以改变。不管怎样,我希望这会有帮助

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

    我尝试了一些有点幼稚的东西——可能不是那么有效——对您的数据帧进行了任意推断。当然,如果我有什么地方弄错了,可以改变。不管怎样,我希望这会有帮助

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

    我尝试了一些有点幼稚的东西——可能不是那么有效——对您的数据帧进行了任意推断。当然,如果我有什么地方弄错了,可以改变。不管怎样,我希望这会有帮助

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

    这是一个看起来不寻常的vcf,是什么程序制作的?也许你应该使用像GATK这样的东西,以你默认想要的格式输出VCF。这不是VCF。。。我们想把一个TXT转换成VCF(这是可以做到的)对不起,如果我遗漏了一些东西,但是还有,
    INDEL
    值,其中有两个
    -
    ,或者两个
    +
    -
    ?例如像
    +C,-CC
    -C,-G
    。如果是这样,在这些情况下,
    REF
    ALT
    会发生什么?通常不应该在同一个位置进行删除和插入。但是是的-它可以是多个
    -
    和多个
    +
    (以及单个
    -
    +
    ),但不可能有一个
    +
    和一个
    -
    ,这是一个外观不寻常的vcf,是什么程序制作的?也许你应该使用像GATK这样的东西,以你默认想要的格式输出VCF。这不是VCF。。。我们想把一个TXT转换成VCF(这是可以做到的)对不起,如果我遗漏了一些东西,但是还有,
    INDEL
    值,其中有两个
    -
    ,或者两个
    +
    -
    ?例如像
    +C,-CC
    -C,-G
    。如果是这样,在这些情况下,
    REF
    ALT
    会发生什么?通常不应该在同一个位置进行删除和插入。但是是的-它可以是多个
    -
    和多个
    +
    (以及单个
    -
    +
    ),但不可能有一个
    +
    和一个
    -
    ,这是一个外观不寻常的vcf,是什么程序制作的?也许你应该使用像GATK这样的东西,以你默认想要的格式输出VCF。这不是VCF。。。我们想把一个TXT转换成VCF(这是可以做到的)对不起,如果我遗漏了一些东西,但是还有,
    INDEL
    值,其中有两个
    -
    ,或者两个
    +
    -
    ?例如像
    +C,-CC
    -C,-G
    。如果是这样,在这些情况下,
    REF
    ALT
    会发生什么?通常不应该在同一个位置进行删除和插入。但是是的-它可以是多个
    -
    和多个
    +
    (以及单个
    -
    +
    ),但不可能有一个
    +
    和一个
    -
    ,这是一个外观不寻常的vcf,是什么程序制作的?也许你应该使用像GATK这样的东西,以你默认想要的格式输出VCF。这不是VCF