Почему мой cbind не сохраняет позицию столбца?

У меня есть три кадра данных, каждый с идентификатором в виде имени строки и индексом в качестве значения столбца. Я хочу связать эти три вместе с

all_indexes <- cbind(res_RNA_1,res_RNA_2,res_RNA_3)

но это делает значение столбца для res_RNA_2 и res_RNA_3 таким же, как res_RNA_2. Ниже приведен заголовок фреймов данных.

> head(res_RNA_1)
                index_1
ENSG00000259884         1
ENSG00000166888         2
ENSG00000259954         3
ENSG00000228509         4
ENSG00000266658         5
ENSG00000267598         6
> head(res_RNA_2)
                index_2
ENSG00000123358         1
ENSG00000158050         2
ENSG00000120738         3
ENSG00000137312         4
ENSG00000137331         5
ENSG00000131196         6
> head(res_RNA_3)
                index_3
ENSG00000123358          1
ENSG00000138166          2
ENSG00000119508          3
ENSG00000158050          4
ENSG00000120738          5
ENSG00000166886          6

а также

> head(all_indexes)
                res_RNA_1 res_RNA_2  res_RNA_3
ENSG00000259884         1         1          1
ENSG00000166888         2         2          2
ENSG00000259954         3         3          3
ENSG00000228509         4         4          4
ENSG00000266658         5         5          5
ENSG00000267598         6         6          6

Когда я смотрю на верхнюю строку и выполняю res_RNA_2["ENSG00000259884",], я получаю [1] 50491, поэтому он дает то же значение для res_RNA_2 и res_RNA_3, что и для res_RNA_1.

Я протестировал его с кодом ниже, и он делает то, что я ожидаю. Однако я не могу найти то, что я делаю иначе, чем в простом коде ниже.

> test1 <- data.frame(c(1,2,3),row.names=c('a','b','c'))
> test2 <- data.frame(c(2,1,3),row.names=c('a','b','c'))
> test3 <- data.frame(c(3,2,1),row.names=c('a','b','c'))
> test_cbind <- cbind(test1,test2,test3)
> test_cbind
  c.1..2..3. c.2..1..3. c.3..2..1.
a          1          2          3
b          2          1          2
c          3          3          1

person Niek de Klein    schedule 30.11.2015    source источник


Ответы (1)


Предположительно, вам действительно нужно слияние, чтобы значения идентификатора оставались выровненными с их «значениями индекса», поэтому что-то вроде этого может быть более полезным:

all_indexes <- do.call('merge', list(res_RNA_1,res_RNA_2,res_RNA_3, by='rownames') )

Без хорошего тестового объекта я не знаю, правильно ли это, но я знаю, что на SO есть несколько проработанных примеров. Поэтому я использовал ваши тестовые объекты и изменил порядок имен строк, чтобы он соответствовал сложности вашей проблемы:

 test1 <- data.frame(c(1,2,3),row.names=c('a','b','c'))
 test2 <- data.frame(c(7,9,12),row.names=c('b','c','a'))
 test3 <- data.frame(c(20, 30, 40),row.names=c('c','b','a'))
 Reduce(function(x,y) {temp <- merge(x,y,by='row.names'); 
                       rownames(temp) <- temp[['Row.names']] # put back rownames as rownames
                       temp[-1]},  # removes the column "Row.names'
          list(test1,test2,test3) )
  c.1..2..3. c.7..9..12. c.20..30..40.
a          1          12            40
b          2           7            30
c          3           9            20
person IRTFM    schedule 30.11.2015