Получение уникальных строк по сумме значений в столбце 2,3,4

Я делаю словарь для анализа в R, и этот словарь должен иметь уникальные метки.

Мои данные выглядят так

Labels  t1  t2  t3
gene1   0.000000E+00    0.000000E+00    1.138501E-01
gene2   0.000000E+00    0.000000E+00    9.550272E-02
gene3   0.000000E+00    1.851936E-02    1.019907E-01
gene4   8.212816E-02    0.000000E+00    6.570984E+00
gene5   1.282434E-01    0.000000E+00    6.240799E+00
gene6   2.918929E-01    8.453281E-01    3.387610E+00
gene7   0.000000E+00    1.923038E-01    0.000000E+00
gene7   0.000000E+00    00000000E+00    0.000000E+00
gene8   1.135057E+00    0.000000E+00    2.491100E+00
gene9   7.935625E-01    1.070320E-01    2.439292E+00
gene10  5.046790E+00    0.000000E+00    2.459273E+00
gene11  3.293614E-01    0.000000E+00    2.380152E+00
gene11  3.293614E-01    0.000000E+00    2.380152E+00
gene12  0.000000E+00    0.000000E+00    1.474757E-01
gene13  0.000000E+00    0.000000E+00    1.521591E-01
gene14  0.000000E+00    9.968809E-02    8.387166E-01
gene15  0.000000E+00    1.065761E-01    0.000000E+00

здесь в таблице метка gene7 появляется два раза, в таком случае необходимо добавить значения во всех столбцах и выбрать значение с наибольшим значением, а другое следует отбросить. В случае связи, как и в случае с геном 11, сначала следует выбрать один, а остальные отбросить.

Я пробовал с сортировкой -u k2V,2 и многими комбинациями, но это не удалось.

Любые лайнеры в awk/python

любезно помогите

Спасибо

2 ответа

Решение

Эта строка:

awk 'NR>1{s=$2+$3+$4;if(($1 in a && s>m[$1])|| !($1 in a)){m[$1]=s;a[$1]=$0}}END{for(x in a)print a[x]}' file|sort -V

выходы:

gene1   0.000000E+00    0.000000E+00    1.138501E-01
gene2   0.000000E+00    0.000000E+00    9.550272E-02
gene3   0.000000E+00    1.851936E-02    1.019907E-01
gene4   8.212816E-02    0.000000E+00    6.570984E+00
gene5   1.282434E-01    0.000000E+00    6.240799E+00
gene6   2.918929E-01    8.453281E-01    3.387610E+00
gene7   0.000000E+00    1.923038E-01    0.000000E+00
gene8   1.135057E+00    0.000000E+00    2.491100E+00
gene9   7.935625E-01    1.070320E-01    2.439292E+00
gene10  5.046790E+00    0.000000E+00    2.459273E+00
gene11  3.293614E-01    0.000000E+00    2.380152E+00
gene12  0.000000E+00    0.000000E+00    1.474757E-01
gene13  0.000000E+00    0.000000E+00    1.521591E-01
gene14  0.000000E+00    9.968809E-02    8.387166E-01
gene15  0.000000E+00    1.065761E-01    0.000000E+00

Сломай:

awk 'NR>1{s=$2+$3+$4;
    if(($1 in a && s>m[$1])|| !($1 in a)){m[$1]=s;a[$1]=$0}
}END{for(x in a)print a[x]}' file|sort -V

Добавить столбец для сумм столбцов 2,3,4, используя my.data <- cbind(my.data, sum=sum(my.data[,c(2:4)]) а потом my.data <- my.data[order(my.data$sum),], наконец, использовать as.vector(table(my.data)) сохранить только самые высокие пронумерованные значения. Нет необходимости в awk, python или любом другом инструменте. Встроенный R отлично справляется со своей задачей.

Другие вопросы по тегам