na.locf删除领先的NAs,保留其他人

时间:2016-03-21 09:26:34

标签: r na zoo locf

我对na.locf包中的zoo函数有疑问。在下面的数据框架中,我想删除领先的NA(1987年,1988年),但保留前一年(1993年)的有效值。

Year     X
1987     NA
1988     NA
1989     2
1990     5
1991     9
1992     16
1993     NA
1994     27
1995     36

有没有人能解决这个问题?

2 个答案:

答案 0 :(得分:5)

na.locf用于填充缺失的观察结果,而不是删除它们。 zoo包还有一个na.trim函数,用于删除前导和/或尾随观察值:

na.trim(mydf)

给出:

> na.trim(mydf)
  Year  X
3 1989  2
4 1990  5
5 1991  9
6 1992 16
7 1993 NA
8 1994 27
9 1995 36

使用sides参数,您可以选择是仅删除前导或尾随缺失的观测值,还是同时删除两者。例如,使用sides = 'right'将只删除尾随缺失的观察结果并保留缺失的观察结果:

> na.trim(mydf, sides = 'right')
  Year  X
1 1987 NA
2 1988 NA
3 1989  2
4 1990  5
5 1991  9
6 1992 16
7 1993 NA
8 1994 27
9 1995 36

因此,使用sides = 'left'只会移除缺失的缺失观察值并保留尾随缺失的观察结果:

> na.trim(mydf, sides = 'left')
   Year  X
3  1989  2
4  1990  5
5  1991  9
6  1992 16
7  1993 NA
8  1994 27
9  1995 36
10 1996 NA

使用过的数据:

mydf <- structure(list(Year = 1987:1996, X = c(NA, NA, 2L, 5L, 9L, 16L, NA, 27L, 36L, NA)),
                  .Names = c("Year", "X"), class = "data.frame", row.names = c(NA,-10L))

答案 1 :(得分:0)

假设您的数据框名称为“df”。

将所有NA转换为无效的数字,例如-1

df$X[is.na(df$X)] <- -1

现在进行行程编码并删除运行长度为-1s的观察值大于1。

rle(df$X)
Run Length Encoding
  lengths: int [1:5] 2 1 1 ...
  values : num [1:5] -1 2 5 ...
df$runs <- rep(rle(df$X)$lengths,rle(df$X)$lengths)

data2 <- df[!(df$X==-1 & df$runs > 1) , ]