Интерполировать данные с использованием plyr в R

69
5

Я пытаюсь использовать plyr и approx для интерполяции значений y для каждого года между наблюдаемыми значениями.


Вместо трех наблюдений для каждой страны,


Я хотел бы иметь 11 наблюдений - по одному на каждый год с 1985 по 1995 год.


Вот пример набора данных


country <- c("country a", "country a", "country a",
"country b", "country b", "country b",
"country c", "country c", "country c")
year <- c(1985, 1990, 1995,
1985, 1990, 1995,
1985, 1990, 1995)
y <- c(10, 12, 16,
NA, 23, 20,
12, 16, NA)

data <- data.frame(cbind(country,year,y))

The data set looks like this:
country year y
1 country a 1985 10
2 country a 1990 12
3 country a 1995 16
4 country b 1985 <NA>
5 country b 1990 23
6 country b 1995 20
7 country c 1985 12
8 country c 1990 16
9 country c 1995 <NA>


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


a <- subset(data, data$country == "country a")

интерполировать значение y за каждый год с 1985 по 1995 год


attach(a)
a.int <- approx(year,y, xout = 1985:1995, method = "linear")

Но как использовать plyr для интерполяции данных для каждой страны?


Я попытался использовать dlply, но выходные значения NA для каждого года


attach(data)
int <- dlply(data, .(country), function(i) approx(i$year, i$y, xout = 1985:1995,
method = "linear")$y )

Как я могу использовать plyr и приближать вместе, чтобы интерполировать значения y?


Кроме того, как только я получу правильный вывод aprrox (который будет список), как мне изменить данные так, чтобы они находились в оригинальном длинном формате? В идеале, данные будут иметь 11 строк в каждой стране и один столбец с значениями y.

спросил(а) 2012-03-23T19:26:00+04:00 8 лет, 6 месяцев назад
1
Решение
80

Я использовал бы ddply вместо dlply для этого.


country <- c("country a", "country a", "country a",
"country b", "country b", "country b",
"country c", "country c", "country c")
year <- c(1985, 1990, 1995,
1985, 1990, 1995,
1985, 1990, 1995)
y <- c(10, 12, 16,
NA, 23, 20,
12, 16, NA)

data <- data.frame(cbind(country,year,y))

my.func<- function(i) {
estimate <- approx(i$year,
i$y,
xout = 1985:1995,
method = "linear")
return(data.frame(year=estimate$x, y=estimate$y, country=unique(i$country)))
}

> ddply(data, .(country), my.func)
year y country
1 1985 10.0 country a
2 1986 10.4 country a
3 1987 10.8 country a
4 1988 11.2 country a
5 1989 11.6 country a
6 1990 12.0 country a
7 1991 12.8 country a
8 1992 13.6 country a
9 1993 14.4 country a
10 1994 15.2 country a
11 1995 16.0 country a
12 1985 NA country b
13 1986 NA country b
14 1987 NA country b
15 1988 NA country b
16 1989 NA country b
17 1990 23.0 country b
18 1991 22.4 country b
19 1992 21.8 country b
20 1993 21.2 country b
21 1994 20.6 country b
22 1995 20.0 country b
23 1985 12.0 country c
24 1986 12.8 country c
25 1987 13.6 country c
26 1988 14.4 country c
27 1989 15.2 country c
28 1990 16.0 country c
29 1991 NA country c
30 1992 NA country c
31 1993 NA country c
32 1994 NA country c
33 1995 NA country c

sessionInfo()
R version 2.14.2 (2012-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets grid methods base

other attached packages:
[1] ggplot2_0.8.9 proto_0.3-9.2 reshape_0.8.4 reshape2_1.2.1 plyr_1.7.1

loaded via a namespace (and not attached):
[1] stringr_0.6

Тем не менее, approx по умолчанию возвращает NA для значений за пределами min или max X. см. ?approx для разных методов для изменения этого параметра.

ответил(а) 2012-03-23T19:35:00+04:00 8 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема