使用data.table的fread读取大TXT文件时的行列子集化问题求助
解决超大TXT文件行+列子集化的内存问题
问题分析
你的代码失败主要有两个原因:
grep未做整词匹配,会误匹配包含目标ID的字符串(比如ID1会匹配ID10)- 未保留文件表头,导致
fread无法正确识别列名,select参数失效
下面提供几种可靠的解决方法:
方法1:用awk同时筛选行和列(推荐,精准高效)
awk可以直接定位目标列、筛选指定ID的行,同时只输出需要的列,避免冗余数据占用内存。假设你的文件是制表符分隔(如果是逗号分隔,将-F'\t'改为-F','):
patient_id = c("ID1", "ID3", "ID4","ID7") id_list = paste(patient_id, collapse="|") sel_cols = c("colA","colB", "colC") # 构造awk命令 awk_cmd = sprintf('awk -F\'\\t\' \'BEGIN{OFS="\\t"} NR==1 { # 记录目标列和ID列的索引 for(i=1; i<=NF; i++) { if($i ~ /^(%s)$/) cols[i] = 1 if($i == "patient_id") id_col = i } # 输出表头 out="" for(i=1; i<=NF; i++) if(cols[i]) out = out $i OFS print substr(out, 1, length(out)-1) } NR>1 { # 筛选ID匹配的行,输出指定列 if($id_col ~ /^(%s)$/) { out="" for(i=1; i<=NF; i++) if(cols[i]) out = out $i OFS print substr(out, 1, length(out)-1) } }\' /home/directory/filename.txt', paste(sel_cols, collapse="|"), id_list) # 读取筛选后的数据 data1 = fread(cmd=awk_cmd)
方法2:改进grep命令,保留表头后再选列
如果更习惯用grep,可以先提取表头,再筛选匹配ID的行,最后用fread选择列:
patient_id = c("ID1", "ID3", "ID4","ID7") id = paste(patient_id, collapse="|") sel_cols = c("colA","colB", "colC") # 先取表头,再取匹配ID的行(-w保证整词匹配) cmd = paste('(head -1 /home/directory/filename.txt; grep -wE "', id, '" /home/directory/filename.txt)') # 读取并选择列 data1 = fread(cmd=cmd, select=sel_cols)
如果ID固定在某一列(比如第2列),可以用更精准的grep匹配:
# 匹配第2列的目标ID cmd = paste('(head -1 /home/directory/filename.txt; grep -wE "^[^\\t]+\\t(', id, ')" /home/directory/filename.txt)') data1 = fread(cmd=cmd, select=sel_cols)
方法3:先定位ID列索引,再精准筛选
如果不知道ID列的位置,可以先获取列索引,再用grep匹配指定列:
# 获取patient_id列的索引 col_idx = system(paste('head -1 /home/directory/filename.txt | tr "\\t" "\\n" | grep -n "patient_id" | cut -d: -f1'), intern=TRUE) col_idx = as.integer(col_idx) patient_id = c("ID1", "ID3", "ID4","ID7") id = paste(patient_id, collapse="|") sel_cols = c("colA","colB", "colC") # 匹配指定列的ID cmd = paste('(head -1 /home/directory/filename.txt; grep -wE "^([^\\t]+\\t){', col_idx-1, '}(', id, ')" /home/directory/filename.txt)') data1 = fread(cmd=cmd, select=sel_cols)
内容的提问来源于stack exchange,提问作者Triparna Poddar
相关产品推荐
相关产品推荐

