質問

私は1つの特定の列が特定の値のセットを持つデータフレームを持っている(のは、1、2を言わせ、...、23)。私は何をしたいのフレームは、余分な23(この場合)の列、係数値の1つを表す各1を持っているでしょう1、このレイアウトから変換することです。これらの列のデータは...特定の行が指定された係数値を有していたかどうかを示す具体的な例を示すブール値であろう:

ソースフレームます:

ID       DATE         SECTOR
123      2008-01-01   1
456      2008-01-01   3
789      2008-01-02   5
... <more records with SECTOR values from 1 to 5>

希望の形式ます:

ID       DATE         SECTOR.1   SECTOR.2   SECTOR.3   SECTOR.4   SECTOR.5
123      2008-01-01      T          F          F          F          F
456      2008-01-01      F          F          T          F          F
789      2008-01-02      F          F          F          F          T

私は、ループ内でそれをやって何の問題もないが、私はより良い方法があることを望みました。これまでのところreshape()は、所望の結果が得られませんでした。ヘルプははるかに高く評価されるだろう。

役に立ちましたか?

解決

私は、「値」と呼ばれる別の列を結合して、value = TRUEを設定しようとするだろう。

df <- data.frame(cbind(1:10, 2:11, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
df <- data.frame(df, value=TRUE)

次に、リシェイプを行います:

reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide")

reshape機能を使用しての問題は、欠損値のデフォルトはNA(あなたが反復処理し、FALSEに置き換える必要があります。その場合には)あるということです。

それ以外の場合は、あなたがcastパッケージの外にreshape使用することができます( / <たとえば、この質問を参照A>)、およびFALSEするデフォルトを設定します。

df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE)
> df.wide 
   ID DATE     1     2     3
1   1    2  TRUE FALSE FALSE
2   2    3 FALSE  TRUE FALSE
3   3    4 FALSE FALSE  TRUE
4   4    5  TRUE FALSE FALSE
5   5    6 FALSE  TRUE FALSE
6   6    7 FALSE FALSE  TRUE
7   7    8  TRUE FALSE FALSE
8   8    9 FALSE  TRUE FALSE
9   9   10 FALSE FALSE  TRUE
10 10   11  TRUE FALSE FALSE

他のヒント

ここではより高速であってもなくてもよいxtabsを使用して、別のアプローチがあります(誰かが試してみて、私に知らせてしまう場合):

df <- data.frame(cbind(1:12, 2:13, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df)
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo)
scroll top