2016-09-30 2 views
1

Я немного почитал об увеличении производительности для циклов в r, но я все еще придерживаюсь одного приема ~ 140 секунд.Увеличьте производительность R для циклов после предварительного распределения структур данных

Начну с кодом:

matrix <- matrix(NA, length(register[,1]), length(AK), dimnames = list(register[,1], AK)) 

data.cleaned <- data[data$FO %in% register[,1],] 
rownames(data.cleaned) <- paste(1:nrow(data.cleaned)) 


for (i in 1 : nrow(data.cleaned)) { 
    for (j in 1 : nrow(matrix)) { 

    if (data.cleaned$FO[i] == rownames(matrix)[j]) { 
     for (k in 1 : ncol(matrix)) { 

       if (data.cleaned$AK[i] == colnames(matrix)[k]) 
        {matrix[j,k] <- 1} 

     } 
    } 
    } 
} 

К сожалению, я не могу поставить любой воспроизводимый пример. Этот очищенный data data frame - это кадр, который включает около 11000 строк. В каждой строке есть наблюдение за FO (основная категория) и для AK (подкатегория для FO) (две разные переменные).

Цель - заполнить матрицу [i, j] с 1, если в одной строке есть соответствующее наблюдение за ФО и АК.

Имеет ли это смысл. Просьба также прокомментировать, если мне нужно указать или могу написать пост в более ясном/лучшем способе

+1

Для петель сами не очень производительный в R , попробуйте заменить так много из них векторизованными функциями и т. д. – snaut

+0

Сколько секунд требуется код из моего ответа на ваши данные? – jogo

ответ

2

Первого шаг:
Вы можете установить

cnames.m <- colnames(matrix) 

, прежде чем идти в петлю. В нужном месте вы можете сделать

if (data.cleaned$AK[i] == cnames.m[k]) matrix[j,k] <- 1 

Второй шаг:
Внутренний контур совпадает с

matrix[j, data.cleaned$AK[i] == cnames.m] <- 1 

Таким образом, нет никакой необходимости в цикле с k.

matrix <- matrix(NA, length(register[,1]), length(AK), dimnames = list(register[,1], AK)) 

data.cleaned <- data[data$FO %in% register[,1],] 
rownames(data.cleaned) <- paste(1:nrow(data.cleaned)) 

cnames.m <- colnames(matrix) 
for (i in 1 : nrow(data.cleaned)) for (j in 1 : nrow(matrix)) 
    if (data.cleaned$FO[i] == rownames(matrix)[j]) matrix[j, data.cleaned$AK[i] == cnames.m] <- 1 

одно замечание об именах объектов:
это не очень хорошая идея назвать матрицу matrix (вы бы назвать собаку Dog?)

Смежные вопросы