16

1つの特定の列に特定の値のセット(たとえば、1、2、...、23)があるデータフレームがあります。私がやりたいのは、このレイアウトから、フレームに追加の23(この場合)の列があり、それぞれが係数値の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()、望ましい結果は得られませんでした。助けていただければ幸いです。

4

2 に答える 2

16

「value」という別の列をバインドして、を設定しようとします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パッケージから使用して(例についてはこの質問を参照)、デフォルトをに設定できます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
于 2010-03-08T19:34:36.893 に答える
4

これは、より速い場合とそうでない場合がある別のアプローチ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)
于 2010-03-08T23:29:04.853 に答える