[英]Data frame “expand” procedure in R?
這不是真正的統計問題,而是執行實際統計分析之前的數據准備問題。 我有一個包含稀疏數據的數據框。 我想“擴展”該數據,以便對缺失值逐個分組地包括零。
這是數據的示例( a
和b
是定義組的兩個因素, 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=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
。
謝謝!
正如您在對另一個答案的評論中所指出的那樣,使用plyr
可以很容易地按組進行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
})
與all.x=TRUE
merge
將使缺失值NA
,因此需要函數的第二行將那些NA
替換為0。
這是令人費解的,但效果很好:
> 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
排序。 如果是這樣,那么很容易做到:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.