複数のデータフレームの列値の合計

複数のデータフレームの列値の合計

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 

すべての列をゼロで埋め、エラーを返します。

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

ここで主な問題はpastesed行および値でLC_ALL解決されます。

  • pasteファイルの結合一行ずつcat *.txtファイルはデータにヘッダー行を挿入して1つずつリンクされます)
  • sed行は、ヘッダー行の最初の項目を除くすべての項目を削除します(源泉)
    • \s+ヘッダー行は、一連の空白文字()と英数字([[:alnum:]])+)で構成されているとします。
  • LC_ALLロケールを管理し、値のポイントに対する誤解を防ぐ変数です。

-Wフィールドで次の区切り文字を使用する場合は、次を追加する必要があります。スペースタブの代わりに。

おすすめ記事