函数/循环将NA替换为R

时间:2016-07-19 16:04:31

标签: r

我有一个包含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 :)缺乏经验:)不确定如何将值索引到左侧或右侧。

1 个答案:

答案 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)