我找不到关于我的问题的另一个问题,尽管存在很多具有类似标题的问题。所以,我有一个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匹配,然后重新排序矩阵列?
答案 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")
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')))