我对R来说比较新,遇到了一些问题。我正在使用某些年份缺少值的数据框。例如:
year var1 var2
1972 1.3 1.4
1973 1.6 2.8
1974 2.0 1.5
1975 NA NA
1976 1.5 2.1
1977 NA NA
1978 1.9 1.1
对于每个NA,我想取上一行和下一行的平均值。因此1975年的var1和var2应分别为1.75和1.8。 1977年他们应该是1.7和1.6。有什么想法吗?
答案 0 :(得分:6)
您可以在na.approx
包中使用zoo
:
library(zoo)
df$var1 <- na.approx(df$var1)
df$var2 <- na.approx(df$var2)
##
> df
year var1 var2
1 1972 1.30 1.4
2 1973 1.60 2.8
3 1974 2.00 1.5
4 1975 1.75 1.8
5 1976 1.50 2.1
6 1977 1.70 1.6
7 1978 1.90 1.1
正如@Jilber指出的那样,这可以用
更简洁地完成df <- sapply(df, na.approx)
根据@Richard Scriven的评论,你可能想要保留
带{/ 1>的data.frame
课程
df[-1] <- lapply(df[-1], na.approx)
或
df[-1] <- vapply(df[-1], na.approx, numeric(nrow(df)))
数据:
df <- read.table(
text="year var1 var2
1972 1.3 1.4
1973 1.6 2.8
1974 2.0 1.5
1975 NA NA
1976 1.5 2.1
1977 NA NA
1978 1.9 1.1",
header=TRUE)