2012-01-31 11 views
2

これは実際の統計的な質問ではなく、むしろ実際の統計的な分析を行う前のデータ準備に関する質問です。私は疎なデータからなるデータフレームを持っています。このデータを「展開」して欠損値のゼロをグループごとにグループ化したいと考えています。ここRのデータフレーム「展開」プロシージャ?

は(tスパースタイムスタンプとx値であり、abグループを規定する2つの要因である)データの例である:

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。これにより、使いやすくなります。

データフレームをソートして各行をループし、一度に1行ずつ欠落した行を追加する、すばやく汚れた実装があります。しかし、私は完全に解決策には満足していません。それを行うより良い方法はありますか?

SASに精通している方は、proc expandと似ています。

ありがとうございます!

答えて

4

、グループでそれを行うことは、単にデータセット「に記入」する方法を残すplyrと簡単です。私のアプローチはmergeです。 all.x=TRUE

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機能の2行目が0のと、それらのNA Sを交換するために必要とされるので、欠損値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

Hm。他の変数でもグループ化したいと思う。このアプローチを拡張するのに十分なほど簡単ですが、誰かが確実に1つのステップでこれを行うコマンドが出てくるかどうかを確認します。 –

+0

はい、この例では、出力データフレームは20行私は2つのグループ(a = 1、b = 1)(a = 1、b = 2)を持っているからです。ご回答有難うございます。 – caas

+0

ああ、 'plyr'パッケージのおかげでグループ分けは本当に問題ではないことが分かりました:ddply(test、c(" a "、" b ")、expand_function)、あなたが提案した行の何かにexpand_functionを定義することができます。 – caas