我正在尝试使用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列有一列。
答案 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
。