对多个数据帧的列值求和

对多个数据帧的列值求和

假设我有 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

这里的主要问题是通过pastesedline 和LC_ALLvalue 来解决的。

  • paste加入文件逐行cat *.txt将一个接一个地连接文件,在数据中插入标题行)
  • sedline 删除除第一次出现之外的标题行 (来源
    • 我假设标题行是一系列空白字符 ( \s+) 后跟字母数字字符 ( [[:alnum:]])+)
  • LC_ALL是一个管理语言环境的变量,可以防止对值中的点的任何误解

-W如果字段用以下分隔符还需添加空格而不是选项卡。

相关内容