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
ここで主な問題はpaste
、sed
行および値でLC_ALL
解決されます。
paste
ファイルの結合一行ずつ(cat *.txt
ファイルはデータにヘッダー行を挿入して1つずつリンクされます)sed
行は、ヘッダー行の最初の項目を除くすべての項目を削除します(源泉)\s+
ヘッダー行は、一連の空白文字()と英数字([[:alnum:]])+
)で構成されているとします。
LC_ALL
ロケールを管理し、値のポイントに対する誤解を防ぐ変数です。
-W
フィールドで次の区切り文字を使用する場合は、次を追加する必要があります。スペースタブの代わりに。