R 向数据帧添加行

R 向数据帧添加行,r,dataframe,R,Dataframe,我逐行读取文件,然后将特定行添加到数据帧中。下面是我将添加到数据帧的一行的示例: 原子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.2

我逐行读取文件,然后将特定行添加到数据帧中。下面是我将添加到数据帧的一行的示例:

原子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
剩余原子计数侧链XCoord YCoord ZCoord 2符合1 A 62.935 97.579 30.223 21 2 A 63.155 95.525 27.079 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)
 }

get.positions当我用我得到的数据运行你的代码时,我得到了
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") )

最后,以下措施奏效了。首先,我制作了一个更大的数据帧,然后只替换特定的行(感谢Joran将我链接到R地狱)

对于询问我为什么在加号上拆分的用户,您的假设是不正确的。语法实际上是“+”,这是一个空格加号,因此它在多个空格上拆分。最后,对于不正确的索引,我终于找到了如何在窗体上显示额外的空格。这是正确的原始行,您将看到索引匹配

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)

get.positions(1)您还没有说问题出在哪里,(2)一旦您发现此代码速度惊人地慢,请尝试阅读的前几节,看看原因以及如何解决。调试变量是否包含正确信息的一种方法是使用
print(变量值)简单地打印
并检查。给我们一个非常小的数据样本集来说明您的问题。例如,查看您的循环,我注意到您将字符串按
+
字符分割,但示例输入中没有加号字符。而且,
strtoi
可能没有做你认为它做的事情;如果向其传递一个浮点,它将返回
NA
。最后,您从哪个软件包获得了
trim
?完全可以接受您自己的问题答案。如果问题解决了,我建议将其标记为已接受,以将其从R问题的“未回答”队列中删除。谢谢