나는 백분율(0.00 - 100.00, 부동 소수점)로 드물게 채워지는 매우 긴 데이터 프레임(~1,100만 x 130)을 가지고 있습니다.
누락된 항목은 아래와 같이 "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