BASH-将类别变量转换为二进制伪变量

时间:2018-07-12 09:28:37

标签: bash awk categorical-data dummy-variable

如何在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

2 个答案:

答案 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