使用因子向量在数据框中查找值

时间:2014-10-09 01:02:28

标签: r

我有一个载体

> 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

1 个答案:

答案 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