0

ファイルを 1 行ずつ読み取ってから、特定の行をデータフレームに追加しています。データフレームに追加する行の例を次に示します。

ATOM 230 CA GLU A 31 66.218 118.140 2.411 1.00 31.82 C

チェックが問題ないことを確認しました。特に rbind コマンドに関係していると思います。ご協力いただきありがとうございます!

編集:エラーは次のとおりです。データフレームの出力は次のとおりです。

Residue AtomCount SideChain XCoord  YCoord ZCoord
2       MET         1         A 62.935  97.579 30.223
21     <NA>         2         A 63.155  95.525 27.079
3      <NA>         3         A 65.289  96.895 24.308

残留物の名前を拾うのをやめたようです..

私が使用しているコードは次のとおりです。

get.positions <- function(sourcefile, chain_required = "A"){
positions = data.frame()
visited = list()
filedata <- readLines(sourcefile, n= -1)
for(i in 1: length(filedata)){
  input = filedata[i]
  id = substr(input,1,4)
  if(id == "ATOM"){
    type = substr(input,14,15)
      if(type == "CA"){
        #if there are duplicates it takes the first one
        residue = substr(input,18,20)
        type_of_chain = substr(input,22,22)
        atom_count = strtoi(substr(input, 23,26))
        if(atom_count >=1){
          if(type_of_chain == chain_required && !(atom_count %in% visited) ){
            position_string = trim(substr(input,30,54))
            position_string = lapply(unlist(strsplit(position_string," +")),as.numeric)
            positions<- rbind(positions, list(residue, atom_count, type_of_chain, position_string[[1]], position_string[[2]], position_string[[3]]))
            }
        }
      }
     }

    } 
        return (positions)
 }
4

2 に答える 2

0

で、最後に、以下が機能しました。最初にはるかに大きなデータフレームを作成し、次に特定の行を置き換えるだけです(RインフェルノにリンクしてくれたJoranに感謝します)。

なぜ私がプラスで分割しているのかと尋ねたユーザーにとって、あなたの仮定は正しくありません。構文は実際には「+」です。これはスペースプラスであるため、複数のスペースで分割されます。最後に、誤ったインデックスについては、フォームに余分なスペースを表示する方法を最終的に理解しました。これが正しい元の行です。インデックスが一致していることがわかります。

ATOM      2  CA  MET A   1      62.935  97.579  30.223  1.00 37.58           C  

動作するRコードは次のとおりです。

get.positions <- function(sourcefile, chain_required = "A"){
N <- 10^5
AACount <- 0
positions = data.frame(Residue=rep(NA, N),AtomCount=rep(NA, N),SideChain=rep(NA, N),XCoord=rep(NA, N),YCoord=rep(NA, N),ZCoord=rep(NA, N),stringsAsFactors=FALSE)     

visited = list()
filedata <- readLines(sourcefile, n= -1)
for(i in 1: length(filedata)){
  input = filedata[i]
  id = substr(input,1,4)
  if(id == "ATOM"){
    type = substr(input,14,15)
      if(type == "CA"){
        #if there are duplicates it takes the first one
        residue = substr(input,18,20)
        type_of_chain = substr(input,22,22)
        atom_count = strtoi(substr(input, 23,26))
        if(atom_count >=1){
          if(type_of_chain == chain_required && !(atom_count %in% visited) ){
            visited <- c(visited, atom_count)
            AACount <- AACount + 1
            position_string = trim(substr(input,30,54))
            position_string = lapply(unlist(strsplit(position_string," +")),as.numeric)
            #print(input)
            positions[AACount,]<- c(residue, atom_count, type_of_chain, position_string[[1]], position_string[[2]], position_string[[3]])
            }
        }
      }
  }

} 
positions<-positions[1:AACount,]
return (positions)

}

于 2012-05-21T15:11:33.170 に答える
0

取得したデータを使用してコードを実行するとtype=="LU"(テストに失敗したtype=="CA"ため)、残りの処理は完了しませんでした。インデックスを次のように変更する必要があるかもしれないと思います

type = substr(input,10,11)

その問題を修正すると他の問題が発生し、目標が明確に述べられていないため、すべての問題を修正することは非常に困難になりますが、再現できるようにコードとデータを編集することをお勧めします。これは、再現可能な入力/実行方法である可能性があります。

get.positions(textConnection("ATOM 230 CA GLU A 31 66.218 118.140 2.411 1.00 31.82 C") )
于 2012-05-21T14:22:22.693 に答える