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