2012-01-31 40 views
2

这不是一个真正的统计问题,而是执行实际统计分析之前的数据准备问题。我有一个由稀疏数据组成的数据框。我希望“扩大”这些数据,以便逐组地包括零值。R中的数据框“展开”过程?

这里是数据的一例(ab是定义组的两个因素,t是稀疏时间戳和x是值):

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)) 

零点已插入的所有缺失值3210。这使它更易于使用。

我有一个快速和肮脏的实现,它对数据框进行排序并循环遍历每行,每次添加一行缺失的行。但我并不完全满意这个解决方案。有没有更好的方法来做到这一点?

对于熟悉SAS的人来说,它与proc expand类似。

谢谢!

回答

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 
}) 

mergeall.x=TRUE会使遗漏值NA,所以需要函数的第二行用0来替换那些NA秒。

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

+0

嗯。我看到你也想通过其他变量对它进行分组。很容易扩展这种方法,但我会等待并看看是否有其他人提出了一步到位的命令;-) – 2012-01-31 17:02:43

+0

是的,在这个例子中,输出数据帧应该有20行因为我有两个组(a = 1,b = 1)(a = 1,b = 2)。感谢您的回答。 – caas 2012-01-31 17:06:55

+0

哦,事实证明由于包'plyr':ddply(test,c(“a”,“b”),expand_function),分组并不是真正的问题,我可以将expand_function定义为你所提议的行。 – caas 2012-01-31 17:10:30