我有一个很长的数据框(约 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