使用 awk 对矩阵每行的字符串出现次数求和

使用 awk 对矩阵每行的字符串出现次数求和

我有一个很长的数据框(约 1100 万 x 130),其中稀疏地填充了百分比(0.00 - 100.00,浮点数)。

缺少的条目标记为“NA”,如下所示:

cat1    NA    NA    99.90    NA    NA    10.90    NA
cat2    NA    1.00    NA    19.12    NA    NA    NA  
cat3    NA    NA    NA    NA    NA    NA    45.00

我想逐行浏览这个数据框并总结“NA”的出现次数。

我通常可以通过执行以下操作在 R 中轻松完成此操作apply(data.frame, 1, function(x) sum(is.na(x)),但由于文件太大,我一直遇到内存问题。如果可能的话,我想使用 AWK 来完成此操作,以便我可以在命令行上应用它来解决未来类似的问题。

我不太擅长 awk,但我本质上想对每个记录/行的字段中“NA”的出现次数进行求和,然后我可以使用它作为跳过文件行的索引。

提前致谢

答案1

简单地说:

$ awk '{ for (i=2;i<=NF;i++) if ($i=="NA") c++; print c; c=0 }' file
5
5
6

答案2

您可以只使用与模式匹配的字符串替换函数NA,并计算它每行出现的次数,并将其总结为整个文件,如下所示。

awk '{ sum += gsub(/NA/, "", $0) } END { print sum }' file

或者使其更加健壮,以避免与模式的错误匹配NA。以下正则表达式基于您的输入示例,但未NA出现在文件开头。

awk '{ sum += gsub(/[[:space:]]*NA[[:space:]]*|[[:space:]]*NA$/, "", $0) } END { print sum }' file

答案3

  • 没有标题的表:awk '{ sum += gsub(/[[:space:]]*NA[[:space:]]*|[[:space:]]*NA$/, "", $0) ; print sum }' file

  • 带标题的表:awk 'NR > 1{ sum += gsub(/[[:space:]]*NA[[:space:]]*|[[:space:]]*NA$/, "", $0) ; print sum }' file

相关内容