我有一堆檔案(由 AlphaFold 生成的 *.pdb 檔案,供從事生物/生命科學作業的人使用),我想在 Julia 中讀入 DataFrames。
它們通常是幾 1000 行這樣的內容:
MODEL 1
ATOM 1 N MET B 1 21.976 -98.993 -39.513 1.00 27.24 N
ATOM 2 CA MET B 1 23.354 -99.175 -39.063 1.00 27.24 C
ATOM 3 C MET B 1 23.767 -98.056 -38.113 1.00 27.24 C
ATOM 4 CB MET B 1 24.308 -99.226 -40.258 1.00 27.24 C
ATOM 5 O MET B 1 23.315 -96.918 -38.253 1.00 27.24 O
ATOM 6 CG MET B 1 24.512-100.624 -40.820 1.00 27.24 C
我使用空格分隔符和忽略重復將它們讀入帶有 CSV.read 的 DataFrame;
headers = ["Type", "Index", "Atom", "Amino acid type", "Chain", "Amino acid number", "Position X", "Position Y", "Position Z", "Something", "pIDDT", "Atom type"]
types = Dict(:"Type"=>String, :"Index"=>Int64, :"Atom"=>String, :"Amino acid type"=>String, :"Chain"=>Char, :"Amino acid number"=>Int64, :"Position X"=>Float64, :"Position Y"=>Float64, :"Position Z"=>Float64, :"Something"=>Float64, :"pIDDT"=>Float64, :"Atom type"=>Char)
df = CSV.read(file, DataFrame; header=headers, skipto=2, delim=' ', ignorerepeated=true, types=types)
問題在于某些行,其中“缺少”空格。在上面示例檔案的最后一行中,第 7 列和第 8 列之間沒有空格,因為值 i 第 8 列 ( -100.624) 占用了它前面的空間。
這會導致如下所示,其中行(現在是第 6 行)偏移了一些資料:
Row │ Type Index Atom Amino acid type Chain Amino acid number Position X Position Y Position Z Something pIDDT Atom type
│ String Int64? String? String? Char? Int64? Float64? Float64? Float64? Float64? Float64? Char?
─────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ ATOM 1 N MET B 1 21.976 -98.993 -39.513 1.0 27.24 N
2 │ ATOM 2 CA MET B 1 23.354 -99.175 -39.063 1.0 27.24 C
3 │ ATOM 3 C MET B 1 23.767 -98.056 -38.113 1.0 27.24 C
4 │ ATOM 4 CB MET B 1 24.308 -99.226 -40.258 1.0 27.24 C
5 │ ATOM 5 O MET B 1 23.315 -96.918 -38.253 1.0 27.24 O
6 │ ATOM 6 CG MET B 1 missing -40.82 1.0 27.24 missing missing
我正在考慮預先格式化檔案(逐行,如果-前面沒有空格,則添加空格),但是有更好的方法嗎?
uj5u.com熱心網友回復:
對于 CSV.jl,我認為沒有比預格式化更好的解決方案了。但是,由于您的檔案很小,您可能只需執行以下操作(以便將預格式化作為 RAM 中的預處理步驟完成):
io = replace(read(file, String), r"(\d)-" => s"\1 -") |> IOBuffer
df = CSV.read(io, DataFrame; header=headers, skipto=2, delim=' ', ignorerepeated=true, types=types)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/493023.html
上一篇:如何向給定的行和列添加另一個值
