2013-05-07 2 views
0

Я делаю словарь для моего анализа в R, и этот словарь должен иметь уникальные метки.Получение уникальных строк на основе суммы значений в 2,3,4 столбце

Мои данные выглядит следующим образом

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/питон

любезно помочь

Спасибо

+0

Почему AWK/Python вместо чистого R? – hd1

ответ

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

Добавьте столбец для сумм столбцов 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 отлично работает.

Смежные вопросы