2015-03-27 2 views
2

На этот раз это может показаться сложным, но я верю, что для некоторых опытных русификаторов это будет легко сделать. У меня есть матрица вроде этого:Поиск шаблона в матрице и на основе этого деления на значение в имени столбца

> dput(head(yoe)) 
structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.5, 
24.5, 32.6, 32.6, 32.6, 32.6), .Dim = c(6L, 21L), .Dimnames = list(
    c("AT1G01050_0", "AT1G01050_1", "AT1G01080_0", "AT1G01080_1", 
    "AT1G01080_2", "AT1G01080_3"), c("10", "33.95", "58.66", 
    "84.42", "110.21", "134.16", "164.69", "199.1", "234.35", 
    "257.19", "361.84", "432.74", "506.34", "581.46", "651.71", 
    "732.59", "817.56", "896.24", "971.77", "1038.91", "MW"))) 

я буду использовать таблицу, чтобы лучше объяснить, что я хочу добиться:

  10 33.95 58.66 84.42 110.21 134.16 164.69 199.1 234.35 257.19 361.84 432.74 506.34 581.46 651.71 732.59 817.56 896.24 
AT1G01050_0 0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0 
AT1G01050_1 0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0 
AT1G01080_0 0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
AT1G01080_1 0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0 
AT1G01080_2 0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0 
AT1G01080_3 0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0 
      971.77 1038.91 MW 
AT1G01050_0  0  0 24.5 
AT1G01050_1  0  0 24.5 
AT1G01080_0  0  0 32.6 
AT1G01080_1  0  0 32.6 
AT1G01080_2  0  0 32.6 
AT1G01080_3  0  0 32.6 

Так в первую очередь. В первой строке мы имеем номер 1 в столбце 234.35. Мы берем это число из colnames и делим его на число в последнем столбце той же строки. Согласно первому ряду:

234.35/24.5 = 9.56, и это число переходит к следующей колонке той же строки (должно быть создано, имя может быть "Fold").

Код должен пройти все строки, но номер 1 будет находиться в разных столбцах (положениях) в этой матрице.

ответ

2

Мы можем использовать max.col на подмножестве набора данных, исключая последний столбец «MW». Предполагая, что для каждой строки есть только один «1», нет необходимости указывать «ties.method». Здесь я дал вариант «первым». Индекс, полученный из этого, может быть использован для получения имени столбца, преобразования его в «числовое», деления его на последний столбец и cbind с исходным набором данных.

yoe1 <- cbind(yoe, newcol=as.numeric(colnames(yoe[,1:20])[max.col(yoe[,1:20], 
        'first')])/yoe[,21]) 
+0

Я ожидал по крайней мере пары строк кода ... Thx много! Для некоторых из вас это слишком просто .. – Rechlay

+0

@Rechlay Это только потому, что я сталкивался с аналогичными проблемами в прошлом. – akrun

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