我正在逐行读取文件,然后将特定行添加到数据框中。以下是我将添加到数据框的一行示例:
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)
}
答案 0 :(得分: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") )
答案 1 :(得分:0)
在结束时,以下工作。首先,我制作了一个更大的数据框,然后只需替换特定的行(谢谢Joran将我链接到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)
}