使用二维数组重新排序R中的列名

时间:2015-09-06 11:17:07

标签: arrays r matrix

我找不到关于我的问题的另一个问题,尽管存在很多具有类似标题的问题。所以,我有一个1000x200的矩阵,化学化合物作为列名。出于某种原因,我想根据一个二维数组重新排序我的化合物,该数组将化合物名称与化合物ID相匹配。例如:

Compound    CID
Ramipril    5362129
Eliprodil   60703
artesunate  5464098
benzonatate 7699

但在我的数据集中是:

    benzonatate   Ramipril  Eliprodil  Artesunate
1   0.453         0.332     0.897      0.123

所需的输出应该是一个矩阵,其列按二维向量排序:

    Ramipril   Eliprodil Artesunate benzonatate  
1   0.332      0.897     0.123      0.453

有没有办法让我可以在同一时间将名称与CID匹配,然后重新排序矩阵列?

1 个答案:

答案 0 :(得分:2)

我们可以使用match来获取基于'化合物'重新排序第二个数据集(' df2')的索引。第一个数据集的列(' df1')。尽管如此,OP提到了matrix作为第一个数据集,对于具有混合类的列使用data.frame可能更好。

 df2[,match(toupper(df1[, 'Compound']), toupper(colnames(df2)), nomatch=0)]
 #  Ramipril Eliprodil Artesunate benzonatate
 #1    0.332     0.897      0.123       0.453

使用另一个例子,我创建了' m2'作为matrix,列名为化合物,

m2N <- m2[,match(toupper(df1N[,'Compound']), toupper(colnames(m2)), nomatch=0)]
m2N 
#     Ramipril Eliprodil artesunate benzonatate
#[1,]        6         1          3           3
#[2,]        4         6          2           2
#[3,]        7         7          4           7
#[4,]        7         1          1           5
#[5,]        3         2         10           7
#[6,]        9         7          2          10
#[7,]        2         0          8           3
#[8,]        0         6          6           8
#[9,]        5         6          7           8
#[10,]       1         0         10           2

数据

df1 <- structure(list(Compound = c("Ramipril", "Eliprodil", "artesunate", 
"benzonatate"), CID = c(5362129L, 60703L, 5464098L, 7699L)),
.Names = c("Compound", 
"CID"), class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(benzonatate = 0.453, Ramipril = 0.332, 
 Eliprodil = 0.897, 
Artesunate = 0.123), .Names = c("benzonatate", "Ramipril", 
"Eliprodil", "Artesunate"), class = "data.frame", row.names = "1")

newdata

df1N <- structure(list(Compound = c("Ramipril", "Eliprodil", "Stargazer", 
"artesunate", "benzonatate", "Ronipril"), CID = c(5362129L, 60703L, 
7859L, 5464098L, 7699L, 7892L)), .Names = c("Compound", "CID"
), class = "data.frame", row.names = c(NA, -6L))

set.seed(24)
m2  <- matrix(sample(0:10, 4*10, replace=TRUE), ncol=4, 
  dimnames=list(NULL, c('benzonatate', 'Ramipril', 'Eliprodil', 'artesunate')))