2017-11-01 1 views
2

유전 정보가 포함 된 데이터 세트가 있습니다.R에서 대괄호 {}를 사용하여 문자열의 여러 문자를 둘러싸는 방법은 무엇입니까?

structure(list(GenBank.Accession.version = structure(1:2, .Label = c("JH739893", 
"JH751134"), class = "factor"), set = c(17L, 116L), snp.po.200.low = c(5480045, 
-102), snp.po.200.up = c(5480464, 340), SNP.position = list(c(5480245L, 
5480263L), c(98L, 139L)), seq2 = c("TTACATGGCAAGCACTCAATCTGGCTGCAGGGTGTCTGGCCACATACAAAACAAATGCCAAGTCACCTCTTGTCCCAAGGATCAAGACAAATTTGGACAACAAACCACACTGGCAGCCCCCTAGAAGCTTTCAGATATTTTAATGCCATTGAGATGTAGCATCCAGTGTAGACATTATTAGAAGCACAGCAGTTGCACTCGCACCTCCAGGGTGTCCAACATATGCTGGATTCTGGCATTGCTCATGGCAAGTGAGTTGGTGAATTCACAACTAGCCAGGTCATGTCTTCATTGCAGCAGAAAACTCATCAGCATGTCAGGATGAGAAAAGTCAATACAAAGGAAATGTGGGGATGGGATGGGATGGGATGGGATGGGATGGGATGGGATGGGATGGGATGGGATGGGATAGGGGGGTAA", 
"AAAAAAAAAAAAAGAAAAGGGAATTTAAGGAGTCCCAGAGACAGGAGAATTCAGGACAATTTGCACCAATCACTTGCTCCTGGAAAGGAAGGTTGGGCTGATTTGGGGTTGGTAAGCACAGACCTTTCATCCGTTCGTAGAAAGAAGGAAAATTAAATCTCATGGCCTGTTTGTGAAAGGAAATTGCCCAGAATAGCTCTGACAGAATAAGCTATTCCACAATAGCTCCCCATGCGGACACTCCAGCCACTTTGTTCCAGGCTAATTAGTGTGCTTCCAAGCGCAGTAATTATCCTGGAAGGGAAATCTCTCCTCTCCCACAAAGAGTGTTTGCATGGAG" 
), seq.length = c(16983252L, 753L), pos.list = list(5480045:5480464, 
    1:340), SNP.pos.in.subset = list(c(201L, 219L), c(98L, 139L 
))), .Names = c("GenBank.Accession.version", "set", "snp.po.200.low", 
"snp.po.200.up", "SNP.position", "seq2", "seq.length", "pos.list", 
"SNP.pos.in.subset"), row.names = c(17L, 116L), class = "data.frame") 

이 데이터는 다음과 같습니다

enter image description here

당신이 볼 수 있듯이, 처음에, 나는 유전 순서 (문자 순서)이 2 선이 내가 원하는 수정할 수 있습니다. 이 문자열은 더 긴 DNA 시퀀스 (첫 번째 시퀀스의 원래 길이는 16983252)에서 서브 세트되었습니다.

SNP.position은 원래 문자열에있는 문자의 위치를 ​​알려줍니다. SNP.pos.in.subset는 나에게 동일한 위치를 제공하지만 부분 집합 내에서만 제공됩니다 (마치 하위 집합에서 1부터 시작하는 경우와 같습니다). 따라서 첫 번째 시퀀스의 경우 : 5480045와 5480464는 부분 집합 시퀀스에서 201 ad 219를 나타냅니다.

이 위치에있는 문자를 쉽게 찾으려면 위치 201과 219 주위에 중괄호를 넣으 려합니다.

이 작업을 수행하는 스크립트를 만들었습니다.

add.target.snp = function(sequences, 
          pos.start = 200, 
          pos.end.added = 3, 
          character.start = "{/", 
          character.end = "}") { 
    old = as.character(sequences) 
    for(i in 1:length(old)){ 
    up.else = SNP.position[i]+pos.end.added 
    old[i] = gsub(paste0('^(.{',pos.start,'})(.*)$'), paste0('\\1',character.start,'\\2'), old[i]) 
    old[i] = gsub(paste0('^(.{',up.else, '})(.*)$'), paste0('\\1',character.end,'\\2'), old[i]) 
    } 

    return(old) 
} 
output.target = add.target.snp(sequences = df$seq2, 
           pos.start = df$SNP.pos.in.subset, 
           pos.end.added = 3, 
           character.start = "{/", 
           character.end = "}") 

그러나이 스크립트는 나에게이 오류 반환 :

Error in gsub(paste0("^(.{", pos.start, "})(.*)$"), paste0("\\1", character.start, : 
    invalid regular expression '^(.{c(201, 219)})(.*)$', reason 'Invalid contents of {}' In addition: Warning message: 
In gsub(paste0("^(.{", pos.start, "})(.*)$"), paste0("\\1", character.start, : 
    argument 'pattern' has length > 1 and only the first element will be used 

내가 내 스크립트를 실행할 수있는 방법이 있나요,하지만 함께 둘러싸는 여러 값을 포함하는 "{/ my_value_at_position_201}"및 "{/ my_value_at_position_219 } "?

(I 보여 데이터의 두 번째 라인에 대한) 최종 결과는해야

AAAAAAAAAAAAAGAAAAGGGAATTTAAGGAGTCCCAGAGACAGGAGAATTCAGGACAATTTGCACCAATCACTTGCTCCTGGAAAGGAAGGTTGGGC{/T}GATTTGGGGTTGGTAAGCACAGACCTTTCATCCGTTCGTA{/G}AAAGAAGGAAAATTAAATCTCATGGCCTGTTTGTGAAAGGAAATTGCCCAGAATAGCTCTGACAGAATAAGCTATTCCACAATAGCTCCCCATGCGGACACTCCAGCCACTTTGTTCCAGGCTAATTAGTGTGCTTCCAAGCGCAGTAATTATCCTGG 

내 스크립트로 다른 문제는 내가 내 경우에는 (내 벡터의 3 문자를 일부 문자를 추가하는 경우 : "{/}"), 두 번째 숫자 (201, 219 + 3)의 위치를 ​​바꿀 것입니다. 숫자가 변경되지 않도록 대괄호를 한 번에 추가하는 방법이 있습니까?

답변

4

정규식이 잘못된 도구입니다. 하위 문자열 대체를 사용하려고합니다. 기본 substr는 길이가 0 인 문자열을 대체하지 않지만, 같은 작업을해야합니다 : 여기

library(stringi) 
library(purrr) 

add_bits <- function(sequences, 
    pos.start = 200, 
    pos.end.added = 3, 
    character.start = "{/", 
    character.end = "}" 
) { 
    # this row allows for the fact that your string is growing. 
    pos.start <- pos.start + c(0, cumsum(rep(nchar(character.start) + 
      nchar(character.end), length(pos.start) -1))) 
    for (ps in pos.start) { 
     stringi::stri_sub(sequences, ps, length = 0) <- character.start 
     stringi::stri_sub(sequences, ps + pos.end.added, length = 0) <- character.end 
    } 
    sequences 
} 

tmp <- c("abcde", "123456789") 
purrr::map2(tmp, list(c(2,5), 3), add_bits) 
## [[1]] 
## [1] "a{/b}cd{/e}fg" 
## 
## [[2]] 
## [1] "12{/3}4567" 
+1

'a {/ b} cde {/ f} '' – zx8754

+0

내 경우는 다음과 비슷하게 보입니다. 첫 번째 문자열에 대한 출력이있는'add_bits (tmp, c (2,6), 3) 'add_bits (tmp, list (c (2,5), 3), 3)'. 이 문제를 해결할 방법이 있습니까? 'add_bits (tmp, unlist (list (c (2,5), 3)), 3)'시도했지만 작동하지 않습니다. SNP 위치와 서열의 연관성을 깨뜨립니다. 나는 또한 함수 안에 "unlist"를 넣으려고했으나, 아무 것도 작동하지 않았다. ... –

+1

문자열 당 여러 개의 요소에 여분의 문자가 있기를 원한다. – dash2

1

내 시도는 기본 패키지를 사용한다 : 그들은 여러 개의 SNP를 표시 할

add.target.snp = function(sequences, pos.start = NA, 
          character.start = "{/", character.end = "}"){ 
    # check input 
    pos.start <- sort(pos.start[ pos.start <= nchar(sequences)]) 

    # split on SNP positions 
    snps <- substring(
    sequences, c(1, pos.start), c(pos.start - 1, nchar(sequences))) 
    # exclude "" SNP strings 
    snps <- snps[ snps != "" ] 

    # take 1st char and wrap, then paste the rest as is 
    x0 <- "" 
    if(!1 %in% pos.start){ 
    x0 <- snps[1] 
    snps <- snps[2:length(snps)]} 

    res <- sapply(snps, function(snp){ 
    x1 <- substr(snp, 1, 1) 
    x2 <- substr(snp, 2, max(2, nchar(snp))) 

    paste0(paste0(character.start, x1, character.end), x2)}) 

    # return 
    paste(c(x0, res), collapse = "") 
} 


tmp <- c("abcde", "123456789") 
purrr::map2(tmp, list(c(2,5), 3), add.target.snp) 
# [[1]] 
# [1] "a{/b}cd{/e}" 
# 
# [[2]] 
# [1] "12{/3}456789" 
관련 문제