2015-12-15 2 views
3

Я занимаюсь около 700 большими наборами данных (с ~ 80 переменными и до 200 тыс. Строк в наборе данных). Большинство переменных допускается только в пределах определенного диапазона или для определенных значений. В каждом наборе данных есть некоторые ошибки со значениями, которые не соответствуют этим правилам.Как повысить точность проверок для ошибок

Итак, как-то мне нужно найти эти ошибки и сделать их NA. В настоящее время я делаю это следующим образом:

library(data.table) 
dataset$variable[!dataset$variable %in% c(1,2,3)] <- NA 
# or 
dataset$variable[!(dataset$variable >= 0 & 
        dataset$variable <= 150)] <- NA 
... # for 80 variables 

Моя проблема заключается в том, что применение этих правил занимает некоторое время (до 10 секунд), и я хотел бы, чтобы ускорить этот процесс. У вас есть идеи, как сделать его более эффективным? Или это уже самый простой способ, и я должен с этим справиться?

Большое вам спасибо!


Изменить: Я интересно, например: Будет ли быстрее перебирать строки вместо столбцов?

+0

Вы можете попробовать использовать 'data.table' пакет. Это может быть немного более эффективным, улучшая ваше время и использует тот же синтаксис. Через 10 секунд для каждого набора данных вам потребуется около 1,5 часов, чтобы обработать все. Я бы предположил, что загрузка данных может занять больше времени, чем фактическая обработка – Vedda

+0

Я забыл упомянуть об этом - я уже использую пакет '' data.table'''. Я бы назвал неправильный синтаксис? И да, загрузка данных также занимает много времени - вот почему я хотел бы сохранить эту часть как можно короче. Поскольку я думаю, что использование '' 'fread''' в качестве альтернативы для' '' read.csv''' – trizzou

+2

О чем ты говоришь? 'fread' *** так *** намного быстрее, чем' read.csv'. – ialm

ответ

5

Если вы ищете чистую производительность, я предлагаю вам проверить data.table пакет, который увеличивает data.frame S в R. data.table может сделать замены на месте, по ссылке (без копирования). Когда вы вызываете операцию присваивания (<-) в R, я считаю, что сделана копия данных, что вызывает замедление для больших наборов данных.

data.table решение для вашей проблемы:

library(data.table) 

# Cast as a data.table 
dataset <- as.data.table(dataset) 

# Do the replacement by reference with the := operation in data.table 
# See ?`:=` 
dataset[!variable %in% c(1,2,3), variable := NA] 
dataset[variable >= 0 & variable <= 150, variable := NA] 

Это должно быть гораздо быстрее, чем замена значений в обычном data.frame с [<-

+0

Теперь требуется всего 2 вместо 10 секунд. Спасибо огромное! – trizzou

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