2015-06-19 3 views
0

Предположим, что данные выглядят так:R: приписывать недостающие данные со средним значением первых предыдущих и последних, не являющихся недостающими данными

df <- data.frame(ID=1:6, Value=c(NA, 1, NA, NA, 2, NA)) 
df 
    ID Value 
1 1 NA 
2 2  1 
3 3 NA 
4 4 NA 
5 5  2 
6 6 NA 

И я хочу вмененный результат будет как:

ID Value 
1 1 1.0 
2 2 1.0 
3 3 1.5 
4 4 1.5 
5 5 2.0 
6 6 2.0 

Более конкретно, Я хочу оспаривать недостающие данные со средним значением для первых предыдущих и последних не пропущенных данных, если существует только одна из предыдущих или последних не пропущенных данных, приписывать эти не пропущенные данные. Поведение для всех данных отсутствует, не определено.

Как я могу это сделать в R?

+1

Это, кажется, что вы ищете: http://stackoverflow.com/questions/15308205/mean-before-after-imputation-in-r – Frank

+0

imputeTS :: интерполяция и зоопарк :: approx может стоить того, чтобы получить решение, подобное запрошенному (не на 100% запрошенному результату) – stats0007

ответ

1

Используйте na.locf как вперед и назад и взять их среднее значение:

library(zoo) 

both <- cbind(na.locf(df$Value, na.rm = FALSE), 
       na.locf(df$Value, na.rm = FALSE, fromLast = TRUE)) 
transform(df, Value = rowMeans(both, na.rm = TRUE)) 

даяние:

ID Value 
1 1 1.0 
2 2 1.0 
3 3 1.5 
4 4 1.5 
5 5 2.0 
6 6 2.0 
0

Это должно сработать.

for(i in 1:nrow(df)){ 
    if(is.na(df$Value[i])){ 
     df$Value[i] <- mean(df$Value[1:i]) 
    } 
} 

Я не знаю, действительно ли это именно то, что вы хотите. Я не понял вашего заявления. «Я хочу оспаривать недостающие данные со средним числом первых предыдущих и последних не пропущенных данных, если существует только одна из предыдущих или последних недостающих данных, приписывать эти недостающие данные»

Какие значения вы хотите найти заменить НС?

1

Посмотрите на дизайн approxfun с rule=2. Это не совсем то, что вы просили (так как это делает линейную интерполяцию через зазоры НСА, а не заменяя средний щелевые конечные точки), но это может быть приемлемым:

> approxfun(df$ID, df$Value, rule=2)(df$ID) 
[1] 1.000000 1.000000 1.333333 1.666667 2.000000 2.000000 

С rule=2 он ведет себя как вы хотели в крайних случаях. В Zoo-пакете также есть методы na.approx.

Я бы предостерег от использования таких данных для дальнейшего статистического вывода. Этот метод вменения по существу говорит о том, что в периоды без измерения нет возможности случайного изменения, и мир, как правило, не так согласован.

Смежные вопросы