如何在bash中将分类变量重新编码为一组二进制伪变量?
例如,让我们想象以下数据集,每行一个:
ID gender smoke
ID1 1 Y
ID2 1 Y
ID3 2 N
ID4 1 F
ID5 2 Y
虽然“性别”列已经以二进制方式编码,但吸烟列(“烟熏”)却没有,因为存在3个类别(Y:是,N:否,F:前者)。如何获取以下数据集?
ID gender smoke.former smoke.never
ID1 1 0 0
ID2 1 0 0
ID3 2 0 1
ID4 1 1 0
ID5 2 0 0
答案 0 :(得分:2)
能否请您尝试以下操作,如果有帮助,请告诉我。
awk 'FNR==1{print $1,$2,"smoke.former smoke.never";next} {print $1,$2,$3=="Y"?0:($3=="F"?"1":"0"),$3=="Y"?0:($3=="N"?"1":"0")}' Input_file | column -t
现在也添加一种非衬套形式的解决方案。
awk '
FNR==1{
print $1,$2,"smoke.former smoke.never";
next
}
{
print $1,$2,$3=="Y"?0:($3=="F"?"1":"0"),$3=="Y"?0:($3=="N"?"1":"0")
}' Input_file | column -t
答案 1 :(得分:1)
$ cat tst.awk
BEGIN {
OFS="\t"
former["F"] = never["N"] = 1
}
FNR==1 { print $1, $2, $3".former", $3".never"; next }
{ print $1, $2, former[$3]+0, never[$3]+0 }
制表符分隔的输出:
$ awk -f tst.awk file
ID gender smoke.former smoke.never
ID1 1 0 0
ID2 1 0 0
ID3 2 0 1
ID4 1 1 0
ID5 2 0 0
直观的柱状输出:
$ awk -f tst.awk file | column -t
ID gender smoke.former smoke.never
ID1 1 0 0
ID2 1 0 0
ID3 2 0 1
ID4 1 1 0
ID5 2 0 0