2013-12-19 2 views
1

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

например.

[NA NA NA 1 2 3 4 5 NA NA] будет изменен на [NA NA NA 1 2 3 4 5 0 0]

Любая помощь или совет, вы, ребята, могли бы предложить были бы оценены!

ответ

3

легко сделать с помощью match() и числовые индексы:

  • использование match() найти первое вхождение не-NA значения
  • использования which() преобразовать логический вектор из is.na() в числовой индекс
  • используйте эту информацию, чтобы найти правильные позиции в x

Следовательно:

x <- c(NA,NA,NA,1,2,3,NA,NA,4,5,NA) 
isna <- is.na(x) 
nonna <- match(FALSE,isna) 
id <- which(isna) 
x[id[id>nonna]] <- 0 

дает:

> x 
[1] NA NA NA 1 2 3 0 0 4 5 0 
+0

Nice, тот действительно элегантное решение! У вас есть какие-либо советы о том, как расширить это до фрейма данных? То есть. То же самое происходит только со многими идентификаторами. Когда я пробую разные вещи, я просто возвращаю сообщение об ошибке «Новые столбцы оставляют дыры после существующих столбцов». Спасибо, ваше решение стало большой помощью! – masterofimps

+0

Это говорит о том, что вы используете 'replace()' с неправильными индексами. Неясно, чего вы хотите. Попробуйте дать минимальный пример в новом вопросе и добавить код, который вы пробовали, но это не сработало. Убедитесь, что вы ссылаетесь на этот. –

1

Вот еще один метод. Сначала конвертируйте все в нули, затем скройте первые нули до NA.

> x <- c(NA,NA,NA,1,2,3,NA,NA,4,5,NA) 
> x[which(is.na(x))] <- 0 
### index from 1 to first element before the first element >0 
> x[1:min(which(x>0))-1] <- NA 
> x 
[1] NA NA NA 1 2 3 0 0 4 5 0 

также

### end of vector (elements are >0) 
> endOfVec <- min(which(x>0)):length(x) 
> x[endOfVec][is.na(x[endOfVec])] <- 0 
[1] NA NA NA 1 2 3 0 0 4 5 0 
Смежные вопросы