2013-12-19 53 views
1

我有一個大型數據集,它由一列ID組成,後面跟着每個ID的每月時間序列。在這個集合中有頻繁的缺失值,但我想要做的是在第一個非零之後用零替換所有的NAs,而在第一個非零值之前將所有的NAs保留爲NA。R僅在第一個非零值後轉換NA's

例如。

[NA NA NA 1 2 3 4 NA NA 5]將改爲[NA NA NA 1 2 3 0 4 5 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

尼斯,這就是一個非常完美的解決方案!你有什麼建議如何將其擴展到數據框? IE瀏覽器。只有許多ID纔是同樣的事情。當我嘗試各種不同的事情時,我只是回來一個「新的列會在現有的列後留下漏洞」的錯誤。謝謝,到目前爲止您的解決方案已經是一個很大的幫助 – 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 
相關問題