2016-01-08 5 views
5

私から、次の表に変更するにはどうすればよい:この表ははどのように適切にtidyrに広がり関数を使用するには

Type Name Answer  n 
TypeA Apple Yes  5 
TypeA Apple No  10 
TypeA Apple DK   8 
TypeA Apple NA   20 
TypeA Orange Yes  6 
TypeA Orange No  11 
TypeA Orange DK   8 
TypeA Orange NA   23 

変更にdf_1と呼ばれる :

Type Name Yes No DK NA 
TypeA Apple 5  10 8 20 
TypeA Orange 6  11 8 23 

私は以下のコードを使用します最初のテーブルを取得します。

df_1 <- 
    df %>% 
    group_by(Type, Name, Answer) %>% 
    tally() 

は、その後、私は2番目のテーブルに取得するにはスプレッドコマンドを使用しようとしましたが、私は次のエラーメッセージました:「エラー:すべての列が名前を付ける必要があります」

df_2 <- spread(df_1, Answer) 

答えて

3

私だけtidyr思いをdf_1からdf_2になるために必要です。

library(magrittr) 
df_1 <- read.csv(text="Type,Name,Answer,n\nTypeA,Apple,Yes,5\nTypeA,Apple,No,10\nTypeA,Apple,DK,8\nTypeA,Apple,NA,20\nTypeA,Orange,Yes,6\nTypeA,Orange,No,11\nTypeA,Orange,DK,8\nTypeA,Orange,NA,23", stringsAsFactors=F) 

df_2 <- df_1 %>% 
    tidyr::spread(key=Answer, value=n) 

出力:

Type Name DK No Yes NA 
1 TypeA Apple 8 10 5 20 
2 TypeA Orange 8 11 6 23 
+0

このメソッドは、上記のコードで機能します。しかし、第1のテーブルのn列(すなわち、df_1)がタリー関数を使用してシステム生成される場合、このメソッドは機能しません。それでも、エラー:すべての列に名前を付ける必要があります。タリーを使用してn列を生成するために使用したコードは、上にリストされています。この場合、スプレッドがn列を認識しないように見えます。その他の提案はありますか? – ayk

+0

アイデア1: 'df_1'の作成の終わりにdplyr :: ungroup()を使います。 – wibeasley

+0

アイデア2: 'as.data.frame()'でキャストします。アイデア3: 'dput()'で出力すると、より良い構造を見ることができます。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-exampleさもなければ、あなたは 'df_1'をどのように入手したかを見るのが難しいです。 – wibeasley

4

aykからのコメントに続いては、私は例を提供しています。これは、NAの値を持つ因子クラスまたは文字クラスのいずれかの列を持つdata_frameを持つときのように見えますが、これを削除したりデータを再分類することなく拡散することはできません。これは、data.frameにNAの値がある場合の私の例では機能するので、data_frameに固有です(名前にアンダースコアを付けたdplyrクラスに注意してください)。例えば、上記の例を少し変更したバージョン:我々はそれを整理しようとすると、ここで

が、その後、この

Source: local data frame [4 x 3] 

    Type Answer  n 
    (chr) (chr) (int) 
1 TypeA Yes  1 
2 TypeA  No  2 
3 TypeB  NA  3 
4 TypeB  No  4 

のように見えるDATA_FRAMEを与えるデータフレーム

library(dplyr) 
library(tidyr) 
df_1 <- data_frame(Type = c("TypeA", "TypeA", "TypeB", "TypeB"), 
        Answer = c("Yes", "No", NA, "No"), 
        n = 1:4) 
df_1 

です

df_1 %>% spread(key=Answer, value=n) 
Error: All columns must be named 

私たちがNAを削除した場合、「動作します」:

df_1 %>% 
    filter(!is.na(Answer)) %>% 
    spread(key=Answer, value=n) 
Source: local data frame [2 x 3] 

    Type No Yes 
    (chr) (int) (int) 
1 TypeA  2  1 
2 TypeB  4 NA 

ただし、NAsを削除すると、希望の結果が得られない場合があります。つまり、整理された表にそれらを含めることができます。データを直接変更して、NAsをよりわかりやすい値に変更することができます。代わりに、データをdata.frameに変更することができます。

as.data.frame(df_1) %>% spread(key=Answer, value=n) 
    Type No Yes NA 
1 TypeA 2 1 NA 
2 TypeB 4 NA 3 
+0

これは知っておくとよい情報です。その知識を共有してくれてありがとう。 8-) – ayk

関連する問題