2016-06-05 3 views
1

Я хотел бы оптимизировать следующие вложенную цикл, который перебирает над выбором набором столбцов в dataframe и проверяет, если она соответствует значениям/строки из вектора:оптимизировать цикл вложенного цикла в R, используя apply?

Positions=c() 
for (col in vectorCols) { 
    for (code in vectorCodes){ 
     Positions<- c(Positions,which(as.numeric(df[,col])==code)) 
    } 

dataframe довольно большой, с 800000 строк. vectorCodes может содержать 100 элементов и около 20 выбранных столбцов (из 2000).

я также пытался что-то вроде следующего, но это не помогло

FunctionGrepCol<-function(col){ 
    Positions <- unlist(lapply(vectorCodes , function(x) (Positions,which(as.numeric(df[,col])==x)))) 
    } 
    Positions <-unlist(lapply(vectorCols, FunctionGrepCol)) 

есть способ объединить положить вложенную цикл в функции применяется для оптимизации его?

+0

Можете ли вы разместить небольшой пример ввода и ожидаемого выхода? Трудно предоставить рабочий код на основе того, что вы здесь указали. – Gopala

+1

'' который уже векторизован, поэтому не уверен, зачем вы его зацикливаете. Например: 'x <- sample (1:10, 100, replace = TRUE); который (x% в% c (2, 3)) ' – Gopala

+0

Я заметил, что% in% было медленнее, чем цикл for, но у меня нет фактических таймингов, я постараюсь их затушить. edit: Хм, хорошо, что это действительно намного быстрее, я не знаю, почему я думал, что цикл цикла был быстрее в этом случае. Огромное спасибо. – tafelplankje

ответ

1

Вы можете попробовать это решение, вместо того чтобы перебирать имена столбцов и подмножества, вы можете сначала подмножить свой фрейм данных и затем пропустить его так же, как список.

Positions <- unlist(lapply(df[, vectorCols], function(col) which(col %in% vectorCodes)))