2017-01-11 10 views
0

複数のカテゴリ変数を持つ表と、バイナリ実験の結果の要約を長い形式に変換して、ロジスティック回帰モデルを簡単に実行したいと考えています。バイナリ結果の要約表を長い整頓データフレームに変換

rep()でベクトルを束ねるだけでなく、dataframeにそれらを組み合わせるだけの簡単な方法はありますか?理想的には、私はこれを自動的に行う機能を望みますが、おそらく私は自分で作る必要があります。例えば

、私はこのサマリー表を開始した場合:

test group  success 
A  control 1 
A  control 0 
A  treat  1 
A  treat  1 
A  treat  0 
B  control 1 
B  control 1 
B  control 1 
B  control 0 
B  control 0 
B  treat  1 
B  treat  0 
B  treat  0 

ありがとう:

test group success n 
A  control 1  2 
A  treat 2  3 
B  control 3  5 
B  treat 1  3 

が、私は戻って、次の形式にそれを切り替えることができるようにしたいです!

+0

関連度:[要約率の行を長いバイナリ応答の行にエレガントに変換しますか?](http://stackoverflow.com/questions/18791355/elegantly-convert-rate-summary-rows-into-long-binary-response -rows/18793811#18793811)。 – Henrik

+0

最初のデータフレームで加重回帰を行う手法は便利ですが、他のタイプのモデルを作成したい場合は、フォーマットをどのように切り替えるのかと思っています。 – user3658457

答えて

2

reshapeパッケージはあなたの友人です、ここにあります。この場合、melt()untable()はデータを正規化するのに便利です。

例要約data.frameがdfという変数である場合には、省略答えは:

# replace total n with number of failures 
df$fail = df$n - df$success 
df$n = NULL 

# melt and untable the data.frame 
df = melt(df) 
df = untable(df, df$value) 

# recode the results, e.g., here by creating a new data.frame 
df = data.frame(
    test = df$test, 
    group = df$group, 
    success = as.numeric(df$variable == "success") 
) 

これは非常に一般的な問題の良い例です。この考え方は、クロス集計の根底にあるデータのリストを逆算することです。クロス集計を考えると、バック計算されたデータのリストは各データに対して1つの行を持ち、各データの属性を含んでいます。 「データオタク」用語でHere is a post to the inverse of this question.

、これは第1正規形にまとめたデータを置くの質問です - それは誰にも役に立つ場合。 Google のデータ正規化を使用すると、さまざまな方法でクロス集計および分析が可能なアジャイルデータフレームを設計できます。具体的には

、ここで動作するようにmelt()untable()ために、生データは、fail(失敗回数)よりもむしろ総nを含めるビットを微調整する必要があるが、それは十分に単純である:

df$fail <- df$n - df$success 
df$n <- NULL 

test group success fail 
1 A control  1 1 
2 A treat  2 1 
3 B control  3 2 
4 B treat  1 2 

ここでテーブルを「溶かす」ことができます。 melt()は、クロス集計を作成するために使用された元のデータリストをバック計算することができます。この場合

df <- melt(df) 

は、私たちは「成功」か「失敗」、そしてオリジナル successまたは fail列からデータムが含まれてい valueという列のいずれかを含む variableと呼ばれる新しい列を取得します。

test group variable value 
1 A control success  1 
2 A treat success  2 
3 B control success  3 
4 B treat success  1 
5 A control  fail  1 
6 A treat  fail  1 
7 B control  fail  2 
8 B treat  fail  2 

untable()関数は数値「カウント」ベクトルの値に応じて、テーブルの各行を繰り返します。この場合、成功数を含み失敗するため、df$valueがカウントベクトルになります。

各データごとに1つのレコードが得られる
df <- untable(df, df$value) 

、いずれかの「成功」か「失敗」:

test group variable value 
1  A control success  1 
2  A treat success  2 
2.1 A treat success  2 
3  B control success  3 
3.1 B control success  3 
3.2 B control success  3 
4  B treat success  1 
5  A control  fail  1 
6  A treat  fail  1 
7  B control  fail  2 
7.1 B control  fail  2 
8  B treat  fail  2 
8.1 B treat  fail  2 

はこれが解決策です。必要であれば、データは現在、1で「成功」を交換し、0を「失敗」するために再コードすることができます(と余分なvaluevariable列を取り除く...)

df <- data.frame(
    test = df$test, 
    group = df$group, 
    success = as.numeric(df$variable == "success") 
) 

これは、要求された解を返します行は異なる方法でソートされます。

test group success 
1  A control  1 
2  A treat  1 
3  A treat  1 
4  B control  1 
5  B control  1 
6  B control  1 
7  B treat  1 
8  A control  0 
9  A treat  0 
10 B control  0 
11 B control  0 
12 B treat  0 
13 B treat  0 

明らかに、data.frameは必要に応じて再ソートできます。 How to sort a data.frame in R.

関連する問題