Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用二维数组对R中的列名重新排序_Arrays_R_Matrix - Fatal编程技术网

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

Arrays 使用二维数组对R中的列名重新排序,arrays,r,matrix,Arrays,R,Matrix,我找不到关于我的问题的其他问题,尽管有很多类似的问题存在。因此,我有一个矩阵1000x200,其中化合物作为列名。出于某种原因,我想根据一个二维数组对化合物重新排序,该数组将化合物名称与化合物ID相匹配。例如: Compound CID Ramipril 5362129 Eliprodil 60703 artesunate 5464098 benzonatate 7699 但在我的数据集中: benzonatate Ramipril Eliprodil Art

我找不到关于我的问题的其他问题,尽管有很多类似的问题存在。因此,我有一个矩阵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同时匹配,然后对矩阵列进行重新排序?

我们可以使用
match
获取索引,以便根据第一个数据集(“df1”)的“复合”列对第二个数据集(“df2”)进行重新排序。尽管OP提到将
矩阵
作为第一个数据集,但对于具有混合类的列,最好使用
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”作为
矩阵
,列名为化合物

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

m2N您的描述
matrix 1000x200,列名称为化合物
,显示的数据不匹配。例如,在第二个数据集中,列名是
X.1
X.2
。我猜您读取的数据集带有
header=FALSE
,因此会自动创建列名,原始列名成为第一行。我根据发布的示例发布了一个解决方案。谢谢你的回答和评论。我试试看。您是wright,我不应该在示例中使用X.1,所以我将对其进行编辑。我的列名就是上面提到的那个。我(错误地)使用X.1等来声明第1列等。列名是化学品的名称,这里我仅使用200中的4个作为示例。感谢您的回复。我包括了这两种情况,所以它可能对您有用。在示例中,第一个数据集中是
青蒿琥酯
,第二个数据集中是
青蒿琥酯
。你有这样的例子吗?我认为你的例子应该有用。在将“df1”列和“df2”列的名称都更改为大写后,我将“df1”列与“df2”列进行了匹配,这样,即使存在如上所述的不匹配,它现在也应该匹配。我编辑了描述,因此我认为现在它更有意义。我会试试你的解决方案,然后再给你回复。非常感谢。第一次很好。很明显,我有一些不匹配的地方,这些地方打乱了我重新排序的尝试,但我处理了它们。非常感谢您的回复。
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")
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')))