【问题标题】:Interpolate data using plyr in R在 R 中使用 plyr 插入数据
【发布时间】:2012-04-08 05:30:45
【问题描述】:

我正在尝试使用 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 和 approx 来插入 y 的值?

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

【问题讨论】:

  • 这是多少个问题?您可能会退后一步,尝试一次解决一个问题。

标签: r plyr


【解决方案1】:

我会为此使用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 了解更改此设置的不同方法。

【讨论】:

  • 谢谢,贾斯汀。当我大约设置 rule = 1 时,我仍然得到每个 y 值的 NA。但所有内插值都应在提供的最小值和最大值范围内 (1985:1995)。
  • 例如,在您的数据集中,国家 B 没有 1985 年的值。因此它不能插值小于 1990 的值(这将是外推!)。 rule=1 是默认行为,所以是的,它返回 NA。您可以查看Hmisc 包中的approxExtrap 进行线性外推。
  • 即使我编辑数据集以使没有 NA,插值 y 值的 ddply 输出仍然都是 NA。对于确实有 NA 的数据集,有没有办法在逐个国家的基础上插入尽可能多的数据?在我的示例中,这将为 A 国插入 11 个值,而为 B 国和 C 国仅插入 6 个值。
  • 不知道该告诉你什么...如果我复制你提供的 data.frame 并运行我编写的代码,我不会得到任何可能发生插值的 NA。查看我的编辑。
  • 贾斯汀,感谢您的帮助。出于某种原因,尽管复制了您的代码,但我仍然得到所有 y 值的 NA。您是否介意发表最后一篇文章,将我的数据框代码与您的 plyr 代码结合起来,以帮助了解我在哪里犯了错误。谢谢!
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多