【问题标题】:Why is my cbind not conserving column position?为什么我的 cbind 不保留列位置?
【发布时间】:2015-11-30 23:39:31
【问题描述】:

我有三个数据框,每个数据框都有一个标识符作为行名,一个索引作为列值。我想用

将这三个绑定在一起
all_indexes <- cbind(res_RNA_1,res_RNA_2,res_RNA_3)

但这使得res_RNA_2res_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_2res_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

【问题讨论】:

    标签: r dataframe cbind


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      相关资源
      最近更新 更多