2015-11-30 2 views
0

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

all_indexes <- cbind(res_RNA_1,res_RNA_2,res_RNA_3) 

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

> head(res_RNA_1) 
       index_1 
ENSG00000259884   1 
ENSG00000166888   2 
ENSG00000259954   3 
ENSG00000228509   4 
ENSG00000266658   5 
ENSG00000267598   6 
> head(res_RNA_2) 
       index_2 
ENSG0000
ENSG00000158050   2 
ENSG00000120738   3 
ENSG00000137312   4 
ENSG00000137331   5 
ENSG00000131196   6 
> head(res_RNA_3) 
       index_3 
ENSG0000
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 

ответ

0

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

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 
Смежные вопросы