我有一个包含1000列的时间序列数据集。每一行当然都是不同的记录。有一些NA值分散在整个数据集中。
我想用相邻的左值或相邻右值替换每个NA,无论哪个都没关系。
一个简洁的解决方案,我想要的是用右边的值替换每个NA,除非它在最后一列,在这种情况下用它左边的值替换它。
我只是要做一个for循环,但我认为一个函数会更有效率。基本上,我不确定如何引用相邻的值。
以下是我的尝试:
for (entry in dataset) {
if (any(is.na(entry)) == TRUE && entry[,1:999]) {
entry = entry[,1]
}
else if (any(is.na(entry)) == TRUE && entry[,1000]) {
entry = cell[,-1]
}
}
正如你所知道的那样,我对R :)缺乏经验:)不确定如何将值索引到左侧或右侧。
答案 0 :(得分:3)
我建议在转置数据集时使用na.locf
。
zoo
包的na.locf函数旨在用最接近的值(同一行中的+1或-1)替换NA
。由于您需要列,我们可以先转置数据集:
library(zoo)
df=matrix(c(1,3,4,10,NA,52,NA, 11, 100), ncol=3)
step1 <- t(na.locf(t(df), fromLast=T))
step2 <- t(na.locf(t(step1), fromLast=F))
print(df)
#### [1,] 1 10 NA
#### [2,] 3 NA 11
#### [3,] 4 52 100
print(step2)
#### [1,] 1 10 10
#### [2,] 3 11 11
#### [3,] 4 52 100
我分两步完成,因为对于内部列和最后一列有不同的处理方式。如果你知道dplyr
包,那么将它变成一个函数会更直接:
library(dplyr)
MyReplace = function(data) {data %>% t %>% na.locf(.,,T) %>% na.locf %>% t}
MyReplace(df)