如何根据另一列中的值创建具有“+”或“-”的列?

如何根据另一列中的值创建具有“+”或“-”的列?

我的数据如下所示:

head retinopathy.pheno.glm.logistic.hybrid1
CHROM   POS ID  REF ALT A1  A1_FREQ FIRTH?  TEST    OBS_CT  BETA    SE  Z_STAT  P   ERRCODE
1   785989  1:785989:T:C    C   T   T   0.154229    N   ADD 1608    0.166419    0.0975993   1.70512 0.0881712   .
1   1130727 1:1130727:A:C   A   C   C   0.0870647   N   ADD 1608    0.148613    0.127899    1.16196 0.245253    .
1   1156131 1:1156131:T:C   T   C   C   0.161692    N   ADD 1608    0.0648246   0.0991692   0.653676    0.51332 .
1   1158631 1:1158631:A:G   G   A   A   0.109142    N   ADD 1608    -0.142729   0.111427    -1.28092    0.200221    .
1   1211292 1:1211292:C:T   C   T   T   0.0631219   N   ADD 1608    -0.102611   0.147134    -0.6974 0.485552    .
1   1478153 1:1478153:T:C   T   C   C   0.285448    N   ADD 1608    0.0407141   0.0791718   0.514251    0.607077    .
...

我将如何创建一个名为“DIR”的附加列,其中包含:

+ if BETA>0
- if BETA<0
0 if BETA=0

答案1

你可以尝试磨坊主

$ mlr --pprint --ifs space --repifs put '
    $DIR = $BETA>0 ? "+" : $BETA<0 ? "-" : "0"
  ' retinopathy.pheno.glm.logistic.hybrid1 
CHROM  POS      ID             REF  ALT  A1  A1_FREQ    FIRTH?  TEST  OBS_CT  BETA       SE         Z_STAT    P          ERRCODE  DIR
1      785989   1:785989:T:C   C    T    T   0.154229   N       ADD   1608    0.166419   0.0975993  1.70512   0.0881712  .        +
1      1130727  1:1130727:A:C  A    C    C   0.0870647  N       ADD   1608    0.148613   0.127899   1.16196   0.245253   .        +
1      1156131  1:1156131:T:C  T    C    C   0.161692   N       ADD   1608    0.0648246  0.0991692  0.653676  0.51332    .        +
1      1158631  1:1158631:A:G  G    A    A   0.109142   N       ADD   1608    -0.142729  0.111427   -1.28092  0.200221   .        -
1      1211292  1:1211292:C:T  C    T    T   0.0631219  N       ADD   1608    -0.102611  0.147134   -0.6974   0.485552   .        -
1      1478153  1:1478153:T:C  T    C    C   0.285448   N       ADD   1608    0.0407141  0.0791718  0.514251  0.607077   .        +

您可能需要根据数据的实际分隔方式来调整--ifs和。--repifs

答案2

怎么样:

awk 'NR==1 {            $(NF+1)="DIR" }
     NR>1  { if($11>0 ){$(NF+1)="+"}
             if($11<0 ){$(NF+1)="-"}
             if($11==0){$(NF+1)="0"}
           } 1 ' file

答案3

您可以使用以下 Perl 代码来转换输入文件:

$ perl -pale '
    $_ .= $" . ("DIR", qw[0 + -][$F[10]<=>0])[$.>1];
' file

输出数据:

CHROM   POS ID  REF ALT A1  A1_FREQ FIRTH?  TEST    OBS_CT  BETA    SE  Z_STAT  P   ERRCODE DIR
1   785989  1:785989:T:C    C   T   T   0.154229    N   ADD 1608    0.166419    0.0975993   1.70512 0.0881712   . +
1   1130727 1:1130727:A:C   A   C   C   0.0870647   N   ADD 1608    0.148613    0.127899    1.16196 0.245253    . +
1   1156131 1:1156131:T:C   T   C   C   0.161692    N   ADD 1608    0.0648246   0.0991692   0.653676    0.51332 . +
1   1158631 1:1158631:A:G   G   A   A   0.109142    N   ADD 1608    -0.142729   0.111427    -1.28092    0.200221    . -
1   1211292 1:1211292:C:T   C   T   T   0.0631219   N   ADD 1608    -0.102611   0.147134    -0.6974 0.485552    . -
1   1478153 1:1478153:T:C   T   C   C   0.285448    N   ADD 1608    0.0407141   0.0791718   0.514251    0.607077    . +

相关内容