我正在尝试解决工作问题,并且是新手程序员。我有三个文件,都是制表符分隔的。
File1 有两个字段:*Marker_id* &位置,此文件按位置 (0-26) 排序,然后 Marker_id 的顺序是另一个应用程序的结果,但不是字母顺序。Marker_id 的顺序很重要,因为目标我的程序是找到一个起始 Marker_id 并计算该标记和结束标记之间的标记数。该文件包含近 2,500,000 个条目。
File2 有一个字段 *Marker_id* 这与 File1 中使用的 Marker_id 相同,但该文件仅包含大约 2,200,000 个条目。这个文件是我的程序应该计算的“活动”标记或标记的列表。
File3 具有字段位置*starting_marker*结束标记*number_markers* 和其他字段。我需要通过计算开始和结束之间的标记数来更新 number_markers 字段。
我已经有将 file1 读入的代码
vector< list<marker> >;
其中标记是一个结构:
struct MARKER{
string snp_id;
bool included;
MARKER(string temp_id) : snp_id(temp_id), included(false) { }
};
文件一中的位置 (0-26) 指定了向量中用于存储标记的索引。我还使用开始和停止之间的标记数成功更新了 file3 中的计数。
但是,我无法实现将列表修剪为仅“活动标记”的功能。我打算简单地做 MARKER.included(true); 对于 file2 中的条目,直到我意识到 file2 不包含位置,因此,我必须在每个向量索引处搜索每个列表。这是可能的,我只是觉得有这么多条目会非常慢。
我正在尝试考虑替代方法,例如将 file1 存储在键为 Marker_id 的地图中,但需要将 Marker_id 保持在原始计数顺序中,这让我束手无策。
有人有建议吗?谢谢。
更新(示例文件):
***File1***
Marker_id position
test_marker_1 1
test_marker_2 1
test_marker_3 1
test_marker_4 1
test_marker_5 1
test_marker_6 1
test_marker_7 1
test_marker_8 1
test_marker_9 1
.
***File2***
Marker_id C20020.Log R Ratio C20020.B Allele Freq
test_marker_1 0.0180 0.0010
test_marker_3 -0.0340 0.5000
test_marker_4 0.0500 0.0700
test_marker_5 0.0500 0.0700
test_marker_6 0.0500 0.0700
test_marker_7 0.0500 0.0700
test_marker_9 0.0500 0.0700
注意:文件 2 中省略了 test_marker_2 和 test_marker_8,因此不会包含在计数中。
***File3***
position copy_num sampleID startMarker endMarker conf num_Markers
1 4 C20020 test_marker_1 test_marker_3 1774.967 0
1 3 C20020 test_marker_3 test_marker_5 17.967 0
1 0 C20020 test_marker_7 test_marker_9 107.967 0
.
***My desired output***
position copy_num sampleID startMarker endMarker conf num_Markers
1 4 C20020 test_marker_1 test_marker_3 1774.967 2
1 3 C20020 test_marker_3 test_marker_5 17.967 3
1 0 C20020 test_marker_7 test_marker_9 107.967 2
就目前而言,除了所有三个示例的计数均为 3 之外,我的所有功能都正常运行,因为我不排除那些在 file2 中找不到的标记。