2014-02-06 2 views
1

У меня есть дата-рамка в R с 11-миллиметровыми строками и 46 столбцами. Некоторые из полей содержат пустые строки (""). Мне нужно заменить эти пустые строки на NA, потому что write.dta (в пакете foreign) не может обрабатывать пустые строки.Замена пустых строк в кадре данных занимает очень много времени

Мой цикл for, однако, занимает очень много времени (около 15 минут на столбец, иногда R/сбои всей системы). Я запускаю RStudio (R 3.0.2) на Mac OS объемом 8 ГБ. Кто-нибудь знает более быстрый способ?

for (i in 1:46){ 

    if (length(which(myDF[,i]==""))!=0) { 

    myDF[,i][which(myDF[,i]=="")]<-NA 

    } 
} 
+0

'for'-петли в R заведомы медленно. Избегайте, когда это возможно. Вместо этого вы можете посмотреть 'apply',' sapply', 'lapply'. Или см. Решение @Zbynek. – MrGumble

+2

@MrGumble не соответствует действительности. Не совсем. –

ответ

9

Это должно работать:

myDF[myDF==''] <- NA 
+0

У вас есть предложение сделать эту работу с кадрами данных, которые имеют столбцы posix? Мне нравится ваше решение, но оно вызывает ошибку «Ошибка в as.POSIXlt.character (x, tz, ...): символьная строка не находится в стандартном недвусмысленном формате», и я хотел бы сохранить типы данных. – triSaratops

+0

@triSaratops Я думаю, вы не можете иметь пустую строку в столбце POSIXlt - 'as.POSIXct ('')' создает ошибку. Не могли бы вы разместить пример своих данных? – Zbynek

2

Вы также можете использовать функцию is.na<-:

is.na(myDF) <- myDF == '' 
Смежные вопросы