Интерполировать переменные в подмножествах фрейма данных

У меня есть большой фрейм данных, в котором есть наблюдения из опросов, проведенных в разных штатах за несколько лет. Вот структура данных:

state | survey.year | time1 | obs1 | time2 | obs2
CA    | 2000        | 1     | 23   | 1.2   | 43
CA    | 2001        | 2     | 43   | 1.4   | 52
CA    | 2002        | 5     | 53   | 3.2   | 61
...
CA    | 1998        | 3     | 12   | 2.3   | 20
CA    | 1999        | 4     | 14   | 2.8   | 25
CA    | 2003        | 5     | 19   | 4.3   | 29
...
ND    | 2000        | 2     | 223   | 3.2   | 239
ND    | 2001        | 4     | 233   | 4.2   | 321
ND    | 2003        | 7     | 256   | 7.9   | 387

Для каждой комбинации состояние / обзор.год я хотел бы интерполировать obs2, чтобы его временное положение совпало с (time1, obs1).

т.е. я хотел бы разбить фрейм данных на фрагменты state / survey.year, выполнить линейную интерполяцию, а затем сшить отдельные фреймы данных state / survey.year обратно вместе в основной фрейм данных.

Я пытался понять, как использовать для этого пакеты plyr и Hmisc. Но все время запутываюсь.

Вот код, который я написал для интерполяции:

require(Hmisc)
df <- new.obs2 <- NULL
for (i in 1:(0.5*(ncol(indirect)-1))){
 df[,"new.obs2"] <-   approxExtrap(df[,"time1"],
                                     df[,"obs1"],
                                     xout = df[,"obs2"],
                                     method="linear",
                                     rule=2)
}

Но я не уверен, как развязать плыр по этой проблеме. Будем очень признательны за ваши щедрые советы и предложения. По сути - я просто пытаюсь интерполировать «obs2» в каждой комбинации состояние / обзор.год, так что временные ссылки совпадают с таковыми из «obs1».

Конечно, если есть отличный способ сделать это без вызова функций plyr, я был бы открыт для этого ...

Спасибо!


person Anupa Fabian    schedule 19.12.2011    source источник


Ответы (1)


Это должно быть так просто, как,

ddply(df,.(state,survey.year),transform,
                              new.obs2 = approxExtrap(time1,obs1,xout = obs2,
                                                      method = "linear",
                                                      rule = 2))

Но я не могу вам ничего обещать, так как не имею ни малейшего представления о том, в чем смысл вашего for цикла. (Он перезаписывает df[,"new.obs2"] каждый раз в цикле? Вы инициализируете весь фрейм данных df значением NULL? Что indirect?)

person joran    schedule 19.12.2011