2016-10-03 6 views
0

国に関するデータがあり、要約して表を作成したいと考えています。IDを繰り返す行を除く2つの変数の数の組み合わせID

> head(data) 
     country year score members 
       A 1989  0  7 
       A 1990  0  7 
       A 1991  0  7 
       A 1992  0  7 
       A 1993  0  7 
       A 1994  0  7 

の表は、国の「スコア」と「会員」の数との関係を示す必要があります - 言い換えると、私はスコア0,1または2で「メンバー」を持っているどのように多くの州を見たい(至るまで1〜7)。

私はこのようにそれを設定したい:私は次のことを実行してこれを行うには

score members==1 members==2 members==3 members==4 members==5 members==6 members==7 
0  1   0 
1  2   0 
2  0   1 and so on.. 

library(dplyr) 
    table <- data %>% 
     group_by(score) %>% 
     summarise(
     m1 = sum(members==1, na.rm=TRUE), 
     m2 = sum(members==2, na.rm=TRUE), 
     m3 = sum(members==3, na.rm=TRUE), 
     m4 = sum(members==4, na.rm=TRUE), 
     m5 = sum(members==5, na.rm=TRUE), 
     m6 = sum(members==6, na.rm=TRUE), 
     m7 = sum(members==7, na.rm=TRUE) 

    ) 

これが与える:

score m1 m2 m3 m4 m5 m6 m7 
     0  0  2  0  0  0  3 30 
     1 15  3 11 11  3 18  3 
     2  3  0  2  2  0  6  9 
. 
. 

私はここで少し助けが必要。ご覧のように、それは観測の合計数を計算しましたが、私は各国を1回だけ数えたいと思います。

このデータを各メンバーレベルの合計国数にするにはどうすればよいですか?

ここで再現性のための私のデータのサンプルです:

data <- 
structure(list(country = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L), .Label = c("A", "B", "C", "D", "E", "F"), class = "factor"), 
    year = c(1989L, 1990L, 1991L, 1992L, 1993L, 1994L, 1995L, 
    1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 
    2005L, 2006L, 2007L, 2008L, 2010L, 1989L, 1990L, 1991L, 1992L, 
    1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 
    2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 
    2011L, 1989L, 1991L, 1993L, 1994L, 1995L, 1996L, 1997L, 1999L, 
    2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 
    2010L, 1989L, 1990L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 
    1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 
    2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 1991L, 1992L, 1993L, 
    1994L, 1995L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 
    2004L, 2005L, 2006L, 2007L, 2008L, 2010L, 1991L, 1992L, 1993L, 
    1994L, 1995L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 
    2004L, 2005L, 2006L, 2007L, 2008L, 2010L), score = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 
    1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 2L, 
    2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
    2L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L 
    ), members = c(7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
    7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 6L, 6L, 6L, 6L, 6L, 
    6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
    7L, 7L, 7L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 
    7L, 7L, 7L, 7L, 7L, 7L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
    4L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L)), .Names = c("country", "year", "score", 
"members"), class = "data.frame", row.names = c(NA, -121L)) 
+3

'(データ、表(スコア、メンバー))と' – Frank

+1

や '国別でなければならない場合(データ、テーブル(スコア、メンバー、国)) ' – Cath

+0

あなたの希望する出力は正確に何ですか? – Cath

答えて

3

OPはdplyrメソッドを使用しているなどの要素の数を取得するために、我々は、「スコア」でグループ化することによってこれを行うことができますのメンバーが(n() )、次にspreadtidyr)を「ワイド」形式に変更します。

library(dplyr) 
library(tidyr) 
data %>% 
    group_by(score, members) %>% 
    summarise(n = n()) %>% 
    mutate(members = paste0("m", members)) %>% 
    spread(members, n, fill = 0) 
# score m1 m2 m3 m4 m5 m6 m7 
# <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#1  0  0  2  0  0  0  3 30 
#2  1 15  3 11 11  3 18  3 
#3  2  3  0  2  2  0  6  9 

我々はまた、「国」でカウントを取得する必要がある場合に予想される出力は、一方が他方の記事で示した場合には、単にgroup_by

data %>% 
    group_by(country, score, members) %>% 
    summarise(n = n()) %>% 
    mutate(members = paste0("m", members)) %>% 
    spread(members, n, fill = 0) 

で「国」を追加data.tableを使用するオプションは 'data.frame'を 'data.table'(setDT(data)に、dcastを 'long'から 'wide'に変換してfun.aggregateを 'value.var'変数のuniqueNとして指定することです。国 'uniqueNは、lengthunique要素を 'country'列に返します。 fill=0は、利用できない組み合わせに対して0を占有することを指定します。デフォルトでは、NAとして返されます。

私はあなたがこれを必要とすると信じて
library(data.table) 
dcast(setDT(data), score~members, value.var= 'country', fun.aggregate = uniqueN, fill = 0) 
# score 1 2 3 4 5 6 7 
#1:  0 0 1 0 0 0 1 2 
#2:  1 1 1 2 2 1 3 2 
#3:  2 1 0 1 2 0 1 1 
+0

これは、OPが得ているものの、得たくない出力です:*あなたが見ているように、国ごとではなく観測数の合計を計算しています* – Cath

+0

はい(本当に2つのパッケージ私はそれが彼らが望んでいるとは思っていません – Cath

+2

'group_by(score、members)%>%summarize(n = n())' 'count(score、members)'と書くことができます。 – Axeman

4

library(reshape2) 
dcast(aggregate(country~score+members, data=data, FUN=function(x) length(unique(x))), 
     score~members, value.var="country", fill=0L) 
# score 1 2 3 4 5 6 7 
#1  0 0 1 0 0 0 1 2 
#2  1 1 1 2 2 1 3 2 
#3  2 1 0 1 2 0 1 1 

それとも、それをdplyr/tidyr方法入れる:

data %>% 
    group_by(members, score) %>% 
    summarise(n=n_distinct(country)) %>% 
    spread(members, n, fill=0L) 

## A tibble: 3 x 8 
# score  1  2  3  4  5  6  7 
#* <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#1  0  0  1  0  0  0  1  2 
#2  1  1  1  2  2  1  3  2 
#3  2  1  0  1  2  0  1  1 
+0

@akrunが来て、私たちは同じようにQを理解しなかった、私はOPが望んだと思ったことのヒントを与える。私は、今、私の答えに基づいて、他の出力を得るオプションを置く以外は同じ出力を得ません... – Cath

+1

私はそれがdplyr方法であるように 'n_distinct(国)'を投稿する方が良いと思います。私は私のものを削除します。私は下の私の答えにあなたのコメントのbczを投稿すると思った – akrun

2

を問題の核心は、重複行を持っているようです毎年?その場合はdistinctで削除することができます。それは簡単なクロス集計です。あなたはmagrittrから%$%博覧パイプを使用することができます。

library(dplyr) 
library(magrittr) 
data %>% 
    distinct(country, score, members) %$% 
    table(score, members) 

    members 
score 1 2 3 4 5 6 7 
    0 0 1 0 0 0 1 2 
    1 1 1 2 2 1 3 2 
    2 1 0 1 2 0 1 1 

または通常のパイプとcrosstab用務員パッケージから:

library(dplyr) 
library(janitor) 
data %>% 
    distinct(country, score, members) %>% 
    crosstab(score, members) 

    score 1 2 3 4 5 6 7 
1  0 0 1 0 0 0 1 2 
2  1 1 1 2 2 1 3 2 
3  2 1 0 1 2 0 1 1 
関連する問題