我有一个载体
> head(gbmPred)
[1] COMPLETED DEAD COMPLETED COMPLETED COMPLETED LOW
我还有一个数据框
> head(gbmPredProb)
COLLECTION COMPLETED DEAD LOW
1 0.04535981 0.8639282 0.07698963 0.01372232
2 0.19031127 0.6680874 0.11708416 0.02451713
3 0.25004446 0.6789679 0.04827067 0.02271702
4 0.09625138 0.7877128 0.09906595 0.01696983
5 0.15696875 0.7617585 0.04441733 0.03685539
6 0.14157307 0.7690410 0.06057754 0.02880836
我想通过使用gbmPred中的级别来查找gbmPredProb中的值来创建一个向量:
0.8639282 0.1170841 0.6789679 0.7877128 0.7617585 0.02880836
有谁知道如何在R中这样做?感谢帮助。
编辑***抱歉复制并粘贴错误。固定在上面 第一个值.86匹配COMPLETED 第二个值.11匹配DEAD
我正在寻找的是循环遍历向量gbmPred以获取值(COMPLETED等),然后在gbmPredProb数据帧中搜索与具有相同名称的列匹配的值以及向量的索引。
所以,第一个值是COMPLETED。看看gbmPredProb并得到.863 gbmPred的第二个值是DEAD。看看gbmPredProb并得到.117 gbmPred的thrid值为COMPLETED。看看gbmPredProb并得到.678
答案 0 :(得分:4)
如果你想要从矩阵中获取一堆(row, col)
对,获得它们的好方法是用2列矩阵进行索引,其中第一列是所有行号您想要的元素和第二列是您想要的元素的所有列号:
gbmPredProb[cbind(1:length(gbmPred), match(gbmPred, names(gbmPredProb)))]
# [1] 0.86392820 0.11708416 0.67896790 0.78771280 0.76175850
# [6] 0.02880836
这种方法的一个优点是,它比大型数据帧上的逐行方法更快:
gbmPredProb <- gbmPredProb[rep(1:6, each=1000),] # 6000x4
gbmPred <- rep(gbmPred, each=1000) # Length 6000
josilber <- function(mat, vec) mat[cbind(1:length(vec), match(vec, names(mat)))]
rscriven <- function(mat, vec) sapply(seq_along(vec), function(i) mat[i, as.character(vec[i])])
all.equal(josilber(gbmPredProb, gbmPred), rscriven(gbmPredProb, gbmPred))
# [1] TRUE
library(microbenchmark)
microbenchmark(josilber(gbmPredProb, gbmPred), rscriven(gbmPredProb, gbmPred))
# Unit: microseconds
# expr min lq median uq max neval
# josilber(gbmPredProb, gbmPred) 328.524 398.8545 442.065 512.949 766.082 100
# rscriven(gbmPredProb, gbmPred) 97843.015 111478.4360 117294.079 123901.368 254645.966 100