2014-10-28 4 views
3

Я относительно новичок в R и сталкиваюсь с некоторыми проблемами. Я работаю с dataframe, у которого отсутствуют определенные значения в определенные годы. Например:Средняя предыдущая и следующая строка для отсутствующего значения

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, я хочу взять среднее из предыдущей и следующей строк. Таким образом, var1 и var2 в 1975 году должны составлять 1,75 и 1,8 соответственно. В 1977 году они должны быть 1,7 и 1,6. Есть идеи?

ответ

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) 
    
  • комментарий
  • Per @Richard Скривен, в вы можете сохранить класс 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) 
+1

Еще одна функция, чтобы забрать домой сегодня вечером. Спасибо. +1 – jazzurro

+1

вы можете сократить свой код с помощью 'sapply':' sapply (df, na.approx) ' –

+0

Это спасатель. Благодаря! – Alex