使用R中的plyr插值数据

时间:2012-03-23 16:26:24

标签: r plyr

我正在尝试使用plyr和approx来插值观察值之间每年的y值。

而不仅仅是每个国家的3个观察结果,

我想有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")

插入1985年至1995年每年的y值

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和about一起插值y的值?

此外,一旦我得到正确的aprrox输出(将列表),我如何重塑数据,使其采用原始的长格式?理想情况下,数据每个国家/地区有11行,y列有一列。

1 个答案:

答案 0 :(得分:3)

我会使用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会为所提供的最小或最大X之外的值返回NA。有关更改此内容的不同方法,请参阅?approx