R中的数据框“扩展”程序?

时间:2012-01-31 16:51:44

标签: r time-series

这不是一个真正的统计问题,而是在进行实际统计分析之前的数据准备问题。我有一个由稀疏数据组成的数据框。我想“扩展”这些数据,以便逐组包含缺失值的零。

以下是数据示例(ab是定义组的两个因素,t是稀疏时间戳,x是值):< / p>

test <- data.frame(
    a=c(1,1,1,1,1,1,1,1,1,1,1),
    b=c(1,1,1,1,1,2,2,2,2,2,2),
    t=c(0,2,3,4,7,3,4,6,7,8,9),
    x=c(1,2,1,2,2,1,1,2,1,1,3))

假设我想扩展t=0t=9之间的值,这是我希望的结果:

test.expanded <- data.frame(
    a=c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
    b=c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2),
    t=c(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9),
    x=c(1,0,2,1,2,0,0,2,0,0,0,0,0,1,1,0,2,1,1,3))

已为t的所有缺失值插入了零。这使它更容易使用。

我有一个快速而又脏的实现,它对数据帧进行排序并循环遍历每一行,一次添加一个缺失的行。但我对解决方案并不完全满意。有没有更好的方法呢?

对于那些熟悉SAS的人来说,它类似于proc expand

谢谢!

2 个答案:

答案 0 :(得分:4)

正如您在对其他答案的评论中所指出的那样,使用plyr进行分组很容易,只留下如何“填写”数据集。我的方法是使用merge

library("plyr")

test.expanded <- ddply(test, c("a","b"), function(DF) {
  DF <- merge(data.frame(t=0:9), DF[,c("t","x")], all.x=TRUE)
  DF[is.na(DF$x),"x"] <- 0
  DF
})
带有merge

all.x=TRUE会生成缺失值NA,因此需要使用函数的第二行将NA替换为0。

答案 1 :(得分:1)

这是令人费解的,但工作正常:

> test <- data.frame(
+   a=c(1,1,1,1,1,1,1,1,1,1,1),
+   b=c(1,1,1,1,1,2,2,2,2,2,2),
+   t=c(0,2,3,4,7,3,4,6,7,8,9),
+   x=c(1,2,1,2,2,1,1,2,1,1,3))
> 
> my.seq <- seq(0,9)
> not.t <- !(my.seq %in% test$t)
> test[nrow(test)+seq(length(my.seq[not.t])),"t"] <- my.seq[not.t]
> test
    a  b t  x
1   1  1 0  1
2   1  1 2  2
3   1  1 3  1
4   1  1 4  2
5   1  1 7  2
6   1  2 3  1
7   1  2 4  1
8   1  2 6  2
9   1  2 7  1
10  1  2 8  1
11  1  2 9  3
12 NA NA 1 NA
13 NA NA 5 NA

不确定您是否希望它之后按t排序。如果是这样,很容易做到:

https://stackoverflow.com/a/6871968/636656