Substituição com valores zero abaixo do treshold, mas a partir de uma célula específica

0

Eu tenho uma matriz na qual eu quero substituir todos os valores com 0 se eles estiverem abaixo de 25. Eu quero manter a primeira linha e coluna.

         p1    p10  p16 p19 p25 p3  p5  p6  p8  p9
call1   567     0   3   0   18  17  8   4   6   7
call20  4900    7   6   2   23  26  20  14  12  29
echo34  73784   1   4   1   6   4   1   4   8   5
kol45   145873  6   4   0   11  17  5   9   22  11

Quando estou removendo esses valores, também estou removendo nomes de linhas e colunas e não quero isso.

    
por k_a_r_o_l 20.06.2018 / 14:33

4 respostas

1

Você pode tentar este awk

awk 'NR>1{for(i=2;i<=NF;i++)$i=$i<25?0:$i}1' infile

NR > 1 mantém a primeira linha
i = 2 manter a primeira coluna

    
por 20.06.2018 / 17:49
1

Usando o R:

dat <- as.matrix(read.table(text="p1    p10  p16 p19 p25 p3  p5  p6  p8  p9
call1   567     0   3   0   18  17  8   4   6   7
call20  4900    7   6   2   23  26  20  14  12  29
echo34  73784   1   4   1   6   4   1   4   8   5
kol45   145873  6   4   0   11  17  5   9   22  11"))

dat
#            p1 p10 p16 p19 p25 p3 p5 p6 p8 p9
# call1     567   0   3   0  18 17  8  4  6  7
# call20   4900   7   6   2  23 26 20 14 12 29
# echo34  73784   1   4   1   6  4  1  4  8  5
# kol45  145873   6   4   0  11 17  5  9 22 11

dat[-1, -1][dat[-1, -1] < 25] <- 0

dat
#            p1 p10 p16 p19 p25 p3 p5 p6 p8 p9
# call1     567   0   3   0  18 17  8  4  6  7
# call20   4900   0   0   0   0 26  0  0  0 29
# echo34  73784   0   0   0   0  0  0  0  0  0
# kol45  145873   0   0   0   0  0  0  0  0  0
    
por 20.06.2018 / 21:56
0

Isso parece fazer o truque:

$ awk '{ for (field=1;field<=NF;field++) { if( NR > 1 && field>=2 && $field < 25 ) { $field=0 } } print }' input
         p1    p10  p16 p19 p25 p3  p5  p6  p8  p9
call1 567 0 0 0 0 0 0 0 0 0
call20 4900 0 0 0 0 26 0 0 0 29
echo34 73784 0 0 0 0 0 0 0 0 0
kol45 145873 0 0 0 0 0 0 0 0 0
    
por 20.06.2018 / 17:04
0

Para preservar o espaçamento, você pode fazer algo como:

perl -pe '
  if ($. > 1) {
    $skip = 2;
    s{ +\d+}{
      --$skip > 0 || $& >= 25 ? $& : " " x (length($&) - 1) . "0"
    }ge
  }' < file

Comprimido:

perl -pe'if($.>1){$s=2;s@ +\d+@--$s>0||$&>24?$&:" "x(length($&)-1)."0"@ge}' file
    
por 20.06.2018 / 18:21

Tags