这不是一个真正的统计问题,而是在进行实际统计分析之前的数据准备问题。我有一个由稀疏数据组成的数据框。我想“扩展”这些数据,以便逐组包含缺失值的零。
以下是数据示例(a
和b
是定义组的两个因素,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=0
和t=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
。
谢谢!
答案 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
排序。如果是这样,很容易做到: