簡體   English   中英

R中的數據框“擴展”過程

[英]Data frame “expand” procedure in 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))

已為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排序。 如果是這樣,那么很容易做到:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM