如何在Julia中仅将列的子集读取到数据框中?

时间:2018-10-03 10:00:39

标签: julia

我有一个像这样的文件:

chr1    47727   47778   2PJ3LS1:190:C5R7BACXX:3:2202:6839:64070 1   +
chr1    48132   48183   2PJ3LS1:190:C5R7BACXX:3:2109:14612:23955    60  +
chr1    49316   49367   2PJ3LS1:190:C5R7BACXX:3:1107:8369:30676 1   +
chr1    57049   57100   2PJ3LS1:190:C5R7BACXX:3:1205:2852:33393 60  -
chr1    59296   59347   2PJ3LS1:190:C5R7BACXX:3:2306:14160:96792    1   -
chr1    62116   62165   2PJ3LS1:190:C5R7BACXX:3:1203:3949:66047 60  +
chr1    64636   64687   2PJ3LS1:190:C5R7BACXX:3:2112:11315:75619    60  -
chr1    108831  108882  2PJ3LS1:190:C5R7BACXX:3:2211:11748:76230    60  +
chr1    150522  150573  2PJ3LS1:190:C5R7BACXX:3:2108:11820:88376    60  -
chr1    180744  180794  2PJ3LS1:190:C5R7BACXX:3:2115:5327:39987 60  -

我不在乎第4列和第5列。读取巨型文件时是否可以忽略这些列? CSV.read中没有任何东西允许这样做。

2 个答案:

答案 0 :(得分:1)

好吧-这不是CSV文件,所以我宁愿直接对其进行解析(虽然效率最高,但在大多数情况下应该足够好了):

df = DataFrame(a=String[], b=Int[], c=Int[])
for line in eachline("filename.txt")
    a, b, c = split(line)
    push!(df, (String(a), parse(Int, b), parse(Int, c))) 
end

编辑:如果您还希望使用第6列(我假设最后一列是Char):

df = DataFrame(a=String[], b=Int[], c=Int[], d=Char[])
for line in eachline("filename.txt")
    a, b, c, _, _, d = split(line)
    push!(df, (String(a), parse(Int, b), parse(Int, c)), d[1]) 
end

答案 1 :(得分:0)

如果您使用的是Linux,则可以使用awk创建仅包含所需列的另一个文件。在朱莉娅:

run(pipeline(`awk '{print $1, $2, $3, $6}' filename.txt`, "otherfile.txt"))
df = CSV.read("otherfile.txt",delim=" ")

我不知道它是否是最有效的,因为它涉及创建中间文件,但是它非常简单,并且允许您在以后需要时保存文件。要删除其中一个或两个,只需运行rm("anyfile.txt)