2012-01-05 10 views
1

私は1つの列に不規則なデータがあります。アンスタックの代わりに必要なもの

my.table <-read.table(text="ticker,date,last 
a,12/20/2011,289295 
a,12/21/2011,NA 
a,12/27/2011,297001 
a,12/28/2011,NA 
b,12/20/2011,151253 
b,12/21/2011,NA 
b,12/27/2011,152413 
b,12/28/2011,NA 
b,1/4/2012,NA 
d,12/21/2011,98.52 
d,12/28/2011,99.36 
d,1/4/2012,103.22", header=TRUE, as.is=TRUE,sep = ",") 

私は通常data.frameに私のデータを再構築するためにunstackを使用しています。しかし、要素の数が異なり、data.frame形式に入れることができないため、unstackは機能しません。

my.expression <-last~ticker 
unstacked <- unstack(my.table, my.expression) #Not a data.frame 

私はこのように私のテーブルをしたいと思います:

   a  b  c 
12/20/2011 289295 151253 NA 
12/21/2011 NA  NA  98.52 
12/27/2011 297001 152413 NA 
12/28/2011 NA  NA  99.36 
1/4/2012 NA  NA  103.22 
+0

可能重複[?Rでリスト内の異なる長さのベクトルを組み合わせる方法](http://stackoverflow.com/questions/8746587/how-t o-combine-vectors-with-a-r-list-in-r) –

+0

@Ritchie Cotton - 私の問題は、単一の列の変形/非スタック問題です。リンク先の投稿はいくつかのdata.framesをcbind'ingすることで解決されます。 –

+0

@リッチーコットン:そうは思わない。その質問はベクトルのリストで始まり、行列で終わります。これは、データフレームで始まり、データフレームで終了します。 –

答えて

5

あなたがreshape2パッケージで見たことがありますか?

Using last as value column: use value.var to override. 
     date  a  b  d 
1 1/4/2012  NA  NA 103.22 
2 12/20/2011 289295 151253  NA 
3 12/21/2011  NA  NA 98.52 
4 12/27/2011 297001 152413  NA 
5 12/28/2011  NA  NA 99.36 

を与えるか

library("reshape2") 
dcast(my.table, date~ticker) 

あなたは

Using last as value column: use value.var to override. 
     date  a  b  d 
1 2011-12-20 289295 151253  NA 
2 2011-12-21  NA  NA 98.52 
3 2011-12-27 297001 152413  NA 
4 2011-12-28  NA  NA 99.36 
5 2012-01-04  NA  NA 103.22 
+0

非常にありがとう。 'reshape2'について知らなかった。オリジナルの「改造」は、私が望むものを私に与えていない。 –

4
with(my.table, tapply(last, list(date, ticker), I)) 
       a  b  d 
1/4/2012  NA  NA 103.22 
12/20/2011 289295 151253  NA 
12/21/2011  NA  NA 98.52 
12/27/2011 297001 152413  NA 
12/28/2011  NA  NA 99.36 
を与える

my.table$date <- as.Date(my.table$date, format="%m/%d/%Y") 
dcast(my.table, date~ticker) 

最初の内部日付形式に日付を変換したい場合

(それが原因日付分類変数を持っていないのアルファごとに並べ替えます。)

my.table$date.dt <- as.Date(my.table$date, format="%m/%d/%Y") 
with(my.table, tapply(last, list(date.dt, ticker), I)) 
       a  b  d 
2011-12-20 289295 151253  NA 
2011-12-21  NA  NA 98.52 
2011-12-27 297001 152413  NA 
2011-12-28  NA  NA 99.36 
2012-01-04  NA  NA 103.22 

以下のコメントに対処するには:あなたがデータフレームではなく、テーブルとしてそれを必要とする場合は、as.dataをラップする必要がありますが結果を中心に.frame:

as.data.frame(with(my.table, tapply(last, list(date.dt, ticker), identity))) 
+0

最後に "私"の目的は何ですか?私は私が(x)as.isを意味することを知っていますが、あなたのコードが私たちをdata.frameとして終わらせる方法を理解していません。 –

+0

原子値を変更しないで返す関数が必要です。また、 'c'や' identity'関数も使えます。そして、それはdata.frameではありません...それは行列として動作する "テーブル"です。 –

+0

ありがとうございます。非常に便利。 –

2

データをファイルdata.txtでこれをしようとしていると仮定。引数はファイル名、データにはヘッダー、フィールド区切り文字はカンマ、最初の列は分割、2番目の列は時間インデックス、時間インデックスのフォーマットは指示どおりです。それを読み込み、一度にすべてを変換していますが、すでに使用してmy.tableにそれを読んだことがある場合は、上記の

> z 
       a  b  d 
2011-12-20 289295 151253  NA 
2011-12-21  NA  NA 98.52 
2011-12-27 297001 152413  NA 
2011-12-28  NA  NA 99.36 
2012-01-04  NA  NA 103.22 

library(zoo) 
z <- read.zoo("data.txt", header = TRUE, sep = ",", split = 1, index = 2, 
     format= "%m/%d/%Y") 

た動物園のオブジェクトは、ティッカーごとに1列と時系列を表し、問題のコードそのちょうどこの:

z <- read.zoo(my.table, split = 1, index = 2, format = "%m/%d/%Y") 
関連する問題