Получение уникальных строк по сумме значений в столбце 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 отлично справляется со своей задачей.