누락된 데이터 확인 시 동일한 ID를 가진 모든 행의 열에 대한 평균값

누락된 데이터 확인 시 동일한 ID를 가진 모든 행의 열에 대한 평균값

통계 및 매핑을 위한 표현형 파일을 준비하기 위해 작은 bash 코드를 작성하려고 합니다. 내 목표는 다음과 같은 성격의 파일에서 동일한 PLOT 번호의 WD 열 값의 평균을 구하는 것입니다.

PLOT BLOC NAME CANE# WD
1001 1 A 1 38.8889
1001 1 A 2 33.3333
1001 1 A 3 
1002 1 B 1 
1002 1 B 2 
1002 1 B 3 
1003 1 C 1 63.1579
1003 2 C 2 95
1003 1 C 3 
[...]

첫 번째 접근 방식은 플롯과 WD 열만 저장되는 새 파일을 만들고, WD 데이터가 누락된 모든 행을 제거한 다음 수식을 적용하는 것이었습니다.awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' input > output

좋은 결과. 그러나 이 경우 "누락된 데이터"를 표시하려는 일부 플롯이 출력 파일에서 완전히 누락되었습니다(예: 이 예의 플롯 1002).

누락된 데이터를 유지하고 이를 평균에 고려하면서 유사한 출력을 얻는 방법을 알고 싶습니다. 실제로 몇 번 시도했지만 잘못된 결과를 얻었습니다. 예를 들어 그래프 1001의 경우 평균값이 36이 아닌 24였습니다(세 번째 데이터 포인트가 누락되어 0으로 간주되어서는 안 됨). 또한 원본 파일에 명령을 적용하여 열 블록과 이름을 보존하는 데 도움이 됩니다.

#Create a file WD with only plot and WD column 
# Delete missing values (Stems that did not exist, for which measurements were not collected)
awk '$2!=""' WD.txt > WD1.txt
# Average WD for each plot
awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' WD.txt > WD1.txt
sed -i '1d' WD1.txt
sed -i '1i PLOT WD%' WD1.txt

당신의 도움을 주셔서 감사합니다. 씨

답변1

WD 필드가 비어 있지 않은 경우에만 개수를 추가할 수 있습니다.

$ awk '
    NR>1 {sum[$1] += $5; count[$1] += $5=="" ? 0 : 1} 
    END {for (i in sum) print i, (count[i] > 0 ? sum[i]/count[i] : "-")}
  ' WD.txt
1001 36.1111
1002 -
1003 79.0789

바퀴를 재발명하고 싶지 않다면 다음을 사용할 수 있습니다.밀러, stats1원하는 방식으로 빈 필드를 처리하는 것 같습니다.

$ mlr --pprint stats1 -g PLOT -a mean -f WD WD.txt 
PLOT WD_mean
1001 36.111100
1002 -
1003 79.078950

Miller 버전의 Ubuntu는 universe저장소에서 사용할 수 있습니다.

관련 정보