我有一個大型數據集,它由一列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]
任何幫助或建議你們可以提供將不勝感激!
我有一個大型數據集,它由一列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]
任何幫助或建議你們可以提供將不勝感激!
很容易做到的使用match()
和數字指標:
match()
找到一個非NA值which()
中第一次出現的邏輯矢量從is.na()
轉換爲數字索引因此:
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
這裏的另一種方法。首先將全部轉換爲零,然後將第一個零轉換回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
尼斯,這就是一個非常完美的解決方案!你有什麼建議如何將其擴展到數據框? IE瀏覽器。只有許多ID纔是同樣的事情。當我嘗試各種不同的事情時,我只是回來一個「新的列會在現有的列後留下漏洞」的錯誤。謝謝,到目前爲止您的解決方案已經是一個很大的幫助 – masterofimps
這告訴我你正在使用帶有錯誤索引的'replace()'。目前還不清楚你想要什麼。試着在一個新問題中給出一個簡單的例子,並添加你嘗試過的代碼,但那是行不通的。確保你鏈接到這個。 –