2014-10-09 3 views
0

Я есть векторИспользуйте фактор Вектор для поиска значение в кадре данных

> 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 для LookUp значения в gbmPredProb:

0,8639282 0,1170841 0,6789679 0,7877128 0,7617 585 0.02880836

Кто-нибудь знает, как это сделать в R? Цените помощь.

EDIT *** Извините, скопируйте и вставьте ошибки. Установленный выше Первое значение .86 матчей ЗАПОЛНЕННУЮ второе значение .11 спички DEAD

, что я ищу это в цикле через вектор gbmPred, чтобы получить значение (завершено, и т.д.), а затем искать gbmPredProb фрейм данных для значение, соответствующее столбцу с тем же именем, а также индекс вектора.

Итак, первое значение ЗАВЕРШЕНО. Посмотрите на gbmPredProb и получите .863 Второе значение gbmPred - DEAD. Посмотрите на gbmPredProb и получите .117 , значение thrid gbmPred COMPLETED. Посмотрите на gbmPredProb и получите .678

ответ

4

Если у вас есть группа из (row, col) пар, которые вы хотите извлечь из матрицы, хороший способ их получить - это индексировать по матрице с двумя столбцами, где находится первый столбец номера строк элементов вы хотите, и второй столбец всех номера столбцов элементов, которые вы хотите:

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 
Смежные вопросы