2012-05-21 4 views
0

Я читаю файл строки за строкой, а затем добавляю определенные строки в dataframe. Вот пример строки, я хотел бы добавить к dataframe:Добавление строки в dataframe

ATOM 230 CA GLU A 31 66,218 118,140 2,411 1,00 31,82 C

Я проверил, что мои чеки в порядке, я думаю, что это специально, чтобы сделать с моей командой rbind. Спасибо за вашу помощь!

Edit: Ошибка следующим образом, выход dataframe является:

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

(1) Вы не сказали, что проблема в том, (2) После того, как вы обнаружите, что этот код _amazingly_ медленно, попробуйте прочитать несколько первых разделов [R Inferno] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf), чтобы понять, почему это так и как его исправить. – joran

+0

способ отладки того, содержит ли переменная правильную информацию или нет, просто распечатать с помощью 'print (variable value)' и проверить. – Subs

+0

Дайте нам очень небольшой набор данных, который иллюстрирует вашу проблему. Например, глядя на ваш цикл, я заметил, что вы разделили строку символом '+', но в вашем примере ввода нет плюсовых символов. Кроме того, 'strtoi', возможно, не делает то, что, по вашему мнению, делает; если вы передадите его с плавающей точкой, он вернет 'NA'. Наконец, из какого пакета вы получили 'trim'? – nograpes

ответ

0

В конце концов работала. Сначала я сделал намного больший кадр данных, а затем просто заменил определенные строки (спасибо Джоран, который связал меня с R-inferno).

Для пользователя, который спросил, почему я раскалываюсь на плюсе, ваше предположение неверно. Синтаксис на самом деле «+», это пробел, так что он разбивается на несколько пробелов. Наконец, что касается неправильных индексов, я, наконец, понял, как показать лишние пробелы в форме. Вот правильная оригинальная строка, вы увидите совпадение индексов.

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) 

}

+0

Вполне нормально принимать свой ответ на ваш вопрос. Если это будет решено, я рекомендую маркировать его как принятое, чтобы удалить его из «неотвеченной» очереди вопросов R. Благодарю. – A5C1D2H2I1M1N2O1R2T1

0

Когда я запустил свой код с этими данными я получил (так что не прошел тест 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")) 
Смежные вопросы