다른 열의 값을 기반으로 "+" 또는 "-"가 있는 열을 만드는 방법은 무엇입니까? [폐쇄]

다른 열의 값을 기반으로 "+" 또는 "-"가 있는 열을 만드는 방법은 무엇입니까? [폐쇄]

내 데이터는 다음과 같습니다.

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    . +

관련 정보