여러 데이터프레임의 열 값 합계

여러 데이터프레임의 열 값 합계

3개의 데이터프레임(별도의 .txt 파일)이 있다고 가정해 보겠습니다.

        Acamar   Begalb     Caspri 
Acamar  0.1      0.0        6.3
Begalb  0.33     8.3        0.0
Caspri  1.4      0.617      2.4

        Acamar   Begalb    Caspri 
Acamar  0.5      3.2        0.1
Begalb  0.0      2.1        0.5
Caspri  4.2      0.0        1.5

        Acamar   Begalb    Caspri 
Acamar  0.5      3.2        0.1
Begalb  0.0      2.1        0.5
Caspri  4.2      0.0        1.5

3개의 데이터프레임의 열 값을 합산하여 다음을 얻습니다.

           Acamar   Begalb    Caspri 
    Acamar  1.1      6.4        6.5
    Begalb  0.33     12.5       1
    Caspri  9.8      0.617      5.4

다음과 같이 datamash를 사용하십시오.

cat *.txt | datamash --headers groupby 1 sum 2-4 

모든 열을 0으로 채우고 오류를 반환합니다.

invalid numeric value in field 2: 'Acamar'

datamash를 사용하는 방법이나 도움이 될 만한 것을 아는 사람이 있습니까?

감사합니다 :)

답변1

이 코드의 작동 방식은 다음과 같습니다.

paste -d"\n" *.txt |
    sed -r '1!{/^(\s+[[:alnum:]])+/d;}' |
    LC_ALL=C ./datamash-1.3/datamash --headers groupby 1 sum 2-4

결과:

GroupBy()       sum(Acamar)     sum(Begalb)     sum(Caspri)
Acamar  1.1     6.4     6.5
Begalb  0.33    12.5    1
Caspri  9.8     0.617   5.4

여기서 주요 문제는 paste, sed라인 및 값으로 LC_ALL해결 됩니다.

  • paste파일 결합한 줄씩( cat *.txt파일은 데이터에 헤더 행을 삽입하여 하나씩 연결됩니다)
  • sed줄은 헤더 줄의 첫 번째 항목을 제외한 모든 항목을 제거합니다(원천)
    • \s+헤더 줄은 일련의 공백 문자( )와 영숫자 문자( [[:alnum:]])+) 로 구성되어 있다고 가정합니다.
  • LC_ALL로케일을 관리하고 값의 포인트에 대한 오해를 방지하는 변수입니다.

-W필드에서 다음 구분 기호를 사용하는 경우 다음을 추가해야 합니다.공간탭 대신.

관련 정보