na.locf 删除前导 NA,保留其他
na.locf remove leading NAs, keep others
我对 zoo
包中的 na.locf
函数有疑问。在下面的数据框中,我想删除领先的 NA(1987 年、1988 年),但保留前一年(1993 年)的有效值。
Year X
1987 NA
1988 NA
1989 2
1990 5
1991 9
1992 16
1993 NA
1994 27
1995 36
有人解决这个问题吗?
假设您的数据框的名称是 'df'。
将所有的 NA 转换成无效的数字,比如 -1
df$X[is.na(df$X)] <- -1
现在进行 运行 长度编码并删除 运行 -1 的长度大于 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) , ]
na.locf
旨在填补缺失的观察结果,而不是删除它们。 zoo 包还有一个 na.trim
函数,它删除前导 and/or 尾随观察:
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))
我对 zoo
包中的 na.locf
函数有疑问。在下面的数据框中,我想删除领先的 NA(1987 年、1988 年),但保留前一年(1993 年)的有效值。
Year X
1987 NA
1988 NA
1989 2
1990 5
1991 9
1992 16
1993 NA
1994 27
1995 36
有人解决这个问题吗?
假设您的数据框的名称是 'df'。
将所有的 NA 转换成无效的数字,比如 -1
df$X[is.na(df$X)] <- -1
现在进行 运行 长度编码并删除 运行 -1 的长度大于 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) , ]
na.locf
旨在填补缺失的观察结果,而不是删除它们。 zoo 包还有一个 na.trim
函数,它删除前导 and/or 尾随观察:
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))