awk를 사용하여 행렬의 각 행에서 문자열 발생 횟수를 합산합니다.

awk를 사용하여 행렬의 각 행에서 문자열 발생 횟수를 합산합니다.

나는 백분율(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

관련 정보