datamash是data和mash的组合词语,data是数据,mash捣碎的意思,这里边应该翻译捣碎更加贴切。它是一个GNU工具,和Linux一些基础命令类似,所以可以使用yum或者apt直接安装。这样就可以在命令行中对数据进行各种处理了。
那么通常都对数据要做哪些处理呢,最基础的当然就是四则运算:加减乘除,在稍微复杂点就是各种乘方开方取余操作,还有各种统计检验函数,更加复杂的就是分组计算以及数据透视等。可以将其看成一个命令行版本的R软件。
官网:https://www.gnu.org/software/datamash/
直接使用apt或者yum工具安装即可。如果不是管理员,可以使用conda安装更加方便。
#conda 安装
conda install -y datamash
调用格式与参数:
datamash的基本调用格式如下:
datamash [option]… op1 column1 [op2 column2 …]
上面的内容转换为描述语言就是:在option的参数下,对column1列进行op1操作,对column2列进行op2操作。
如果使用--group参数,所有的operation都将会分组进行;
如果没有使用--group,所有的operation会对所有的值进行。需要说明的是这里的column1可以是表示第几列的数字,当使用-H或者--header-in时可以是所选字段的名称,可以使用列名,当operation要求输入成对数据的时候使用:连接,比如spearson 5:6。
Primary operations:
primary operations决定了文件将被如何处理,如果primary operation没有设置,整个文件将会被逐行处理(针对per-line operation)或者将所有行按照一组进行处理。
groupby:分组等同于 --group或者-g参数。后面指定用于分组的列
crosstab:类似于excel中的数据透视表Pivot Table,可以按照两列来处理矩阵,默认是计算在a,b中出现的次数
transpose:交换行列,转置,等价于R中的t()
reverse:反转字段顺序,交换列
check:验证数据结构,保证每行字段相同
Line-Filtering operations:
rmdup:删除有重复键值的行
Per-Line operations:
round:四舍五入整数值 floor:不小于输入的最小整数值,向上取 ceil:不大于输入的最大整数值,向下取 trunc:取整数部分 frac:取小数部分
Group-by Numeric operations:
sum:求和
min:最小值
max:最大值
absmin:最小绝对值
absmax:最大的绝对值
range:最大值-最小值
Group-by Textual/Numeric operations:
count :分组中元素个数
first:分组中第一个值
last:分组中最后一个值
rand:分组中一个随机值
unique:逗号分割的所有唯一值
collapse:逗号分科的所有值
countunique:唯一值的个数
Group-by Statistical operations:
mean:均值
mode:众数
median:中位数
q1:第一四分位数
q3:第三四分位数
iqr:四分位距
perc:百分位值,默认取 95,perc:25 等同于q1
antimode:最少出现的数
pstdev:总体标准差
sstdev:样本标准差
pvar:总体方差
svar :样本方差
mad:scaled绝对中位差
madraw:原始绝对中位差
sskew:样本偏度
关于sskew值对应区间的说明
pskew:总体偏度
skurt:样本超值峰度
pkurt:总体超值峰度
jarque:Jarque-Beta test for normality P值
dpo:D'Agostino-Pearson Omnibus test for normality P值 scov:样本协方差(要求pair数据)
pcov:总体协方差(要求pair数据)
spearson:样本pearson相关系数(要求pair数据) ppearson:总体pearson相关系数(要求pair数据)
主要参数
-f, --full: 进行计算前打印所有行
-g, --group:按照列分组
--header-in:输入文件第一行为列名,不进行计算
--header-out:输出第一行为列名
-i:对文本操作是忽略大小写
-s:分组前先排序,等同于sort
-t:指定输入文件分隔符
--output-delimiter:指定输出文件分隔符
--narm:跳过NA -R,
--round:输出结果保留几位小数
-W, --whitespace: 使用一个或者多个空格或者tab作为分隔符
操作示例:
# 计算1-10的和与平均值
$ seq 10 | datamash sum 1 mean 1
# 将数据进行转置
$ seq 10 | paste - - | datamash transpose
$ seq 10 | paste - - - | datamash transpose
# 按列计算,使用不同的语法
$ seq 100 | paste - - - - | datamash sum 1 sum 2 sum 3 sum 4
$ seq 100 | paste - - - - | datamash sum 1,2,3,4
$ seq 100 | paste - - - - | datamash sum 1-4
$ seq 100 | paste - - - - | datamash sum 1-3,4
# 调整分隔符
$ seq 10 | xargs -n 5 |datamash -W sum 2
# 分组计算频数,根据第二列进行分组。如果计算其他值,只需更换函数就行
## 使用软件自带的测试数据集scores_h.txt,有三列,分别是学生姓名科目和成绩。
$ cat /usr/local/share/datamash/examples/scores_h.txt |head
Name Major Score
Shawn Arts 65
Marques Arts 58
Fernando Arts 78
Paul Arts 63
Walter Arts 75
Derek Arts 60
Nathaniel Arts 88
Tyreque Arts 74
Trevon Arts 74
# 检查行列完整性
$ cat scores_h.txt |datamash check
84 lines, 3 fields
# 交换列顺序
$ cat scores_h.txt |datamash reverse |head -n5
Score Major Name
65 Arts Shawn
58 Arts Marques
78 Arts Fernando
63 Arts Paul
# 根据前两列构建透视表,且显示分数
$ cat scores.txt | datamash groupby 2 count 2
# 因为这个文件有 header 所以需要使用--header-in参数
Arts Business Engineering Health-Medicine Life-Sciences Social-Sciences
Aaron N/A 83 N/A N/A 58 N/A
Allen N/A N/A N/A N/A 50 N/A
Andre N/A N/A N/A 72 N/A N/A
Angel N/A N/A N/A 100 N/A N/A
Anthony N/A N/A N/A N/A 32 N/A
Antonio N/A N/A 88 N/A N/A N/A
Austin N/A N/A N/A N/A 91 N/A
Avery N/A N/A 51 N/A N/A N/A
Brandon N/A N/A N/A N/A 72 N/A
# 根据第二列进行分组,计算第三列的最大值和最小值
$ cat scores.txt | datamash --sort groupby 2 min 3 max 3
# 输出表头
$ cat scores.txt | datamash --header-out groupby 2 min 3 max 3
# 跳过第一行表头
$ cat scores_h.txt | datamash groupby 2 min 3 max 3
$ cat scores_h.txt | datamash --header-in groupby 2 mean 3
# 使用列名代替列号,设置小数位点
$ cat scores_h.txt | datamash --headers groupby Major mean Score -R 2
# 计算频数
$ cat genes_h.txt | datamash -s -g 3 count 3
# 计算特异的频数
$ cat genes_h.txt | datamash -s -g 3 countunique 2
# 分组统计操作
$ cat scores.txt
Name Subject Score
Bryan Arts 68
Isaiah Arts 80
Gabriel Health-Medicine 100
Tysza Business 92
Zackery Engineering 54
...
$ datamash --sort --headers --group 2 mean 3 sstdev 3 < scores.txt
GroupBy(Subject) mean(Score) sstdev(Score)
Arts 68.9474 10.4215
Business 87.3636 5.18214
Engineering 66.5385 19.8814
Health-Medicine 90.6154 9.22441
Life-Sciences 55.3333 20.606
Social-Sciences 60.2667 17.2273
$ datamash -H mean 1 q1 1 median 1 q3 1 iqr 1 sstdev 1 jarque 1 < FILE
mean(x) q1(x) median(x) q3(x) iqr(x) sstdev(x) jarque(x)
45.32 23 37 61.5 38.5 30.4487 8.0113-09
官方文档:
https://www.gnu.org/software/datamash/manual/datamash.html#Overview
https://www.mankier.com/1/datamash