Алгоритм подсчета больших данных в R

У меня есть большой фрейм данных с почти 1 млн строк (транзакций) и 2600 столбцов (элементов). Значения в наборе данных - это 1 и NA. Тип данных всех значений фактор. Я хочу добавить новый столбец в конец кадра данных, который показывает сумму всех единиц в каждой строке.

Вот код R, который я написал:

for(i in 1:nrow(dataset){
    counter<-0
    for(j in 1:ncol(dataset){
        if(!is.na(dataset[i,j])){
           counter<- counter+1
         }
     }
     dataset[i,ncol(dataset)+1]<-counter 
}

Но это было очень долгое время, когда он работал в R studio, потому что время работы составляет O (n ^ 2). Мне интересно, есть ли другой способ сделать это или способ улучшить этот алгоритм? (Машина имеет 80Gb памяти)


person Mehrdad Rohani    schedule 12.09.2013    source источник
comment
Если ваши данные только 1, а NA используют матрицу (или таблицу данных), а не фрейм данных. Посмотрите на ?apply или, если это слишком медленно, Rcpp.   -  person joran    schedule 12.09.2013


Ответы (2)


Поскольку eddi answer является лучшим в вашем случае, более общим решением является векторизация кода (означает: работать со всеми строками одновременно) :

counter <- rep(0, nrow(dataset))
for(j in 1:ncol(dataset)) {
     counter <- counter + !is.na(dataset[[j]])
}
dataset$no_of_1s <- counter 

Одно примечание: в вашем коде в строке:

dataset[i,ncol(dataset)+1]<-counter 

вы создаете новый столбец для каждой строки (потому что для каждого шага есть еще один столбец), поэтому окончательный data.frame будет иметь 1 миллион строк и 1 миллион столбцов (поэтому он не будет соответствовать вашей памяти).


Другой вариант — использовать Reduce

dataset$no_of_1s <- Reduce(function(a,b) a+!is.na(b), dataset, init=integer(nrow(dataset)))
person Marek    schedule 12.09.2013

Использование матрицы (чисел, а не факторов), как предложил @joran, было бы лучше для этого, и просто выполните:

rowSums(your_matrix, na.rm = T)
person eddi    schedule 12.09.2013