2016-06-21 3 views
2

が私のデータセットのようなものの一部であるRでのサマリー表を作成します。私は、それぞれが1(0 0.25から0.75への値のために基づいてラベルをPERCENT_RANK割り当てカウントサイトごとにラベルと以下

require(dplyr) 
alldata 
site date percent_rank Label 
01A 2013-01-01 0.32   Normal 
01B 2013-01-01 0.12   Low 
01C 2013-01-01 0.76   High 
02A 2013-01-01  0   N/A 
02B 2013-01-01 0.16   Low 
02C 2013-01-01 0.5   Normal 
01A 2013-01-02 0.67   Normal 
01B 2013-01-02 0.01   Low 
01C 2013-01-02 0.92   High 

3つのカテゴリ)。私は今、この形式で集計表を作成したいと思います:

site Low Normal High Missing 
01A 32 47  92 194 
01B 232 23  17 93 
01C 82 265  12 6 

各サイトは、そのサイトのラベルを持つすべての日付のために、低ノーマル、および高い値の出現数を持っているでしょう(のためのものがあります毎年)、N/A値は「Missing」列にカウントされます。

私は次のことを試してみました:

すべてのレコードの合計値ではなく、サイトごとに「低」の数、およびいくつかの値を返します

alldata <- %>% group_by(site) %>% mutate(length(which(Label == "Low"))) 

を返し

alldata <- %>% group_by(site) %>% mutate(length(Label == "Low")) 

レコードの合計数よりも1000多い。アイデアは、4つの別々のmutate行(各カテゴリに1つずつ)を持つ4つの新しい列を作成するためにこの関数を繰り返すことで、サマリー表が作成されるということでした。私は、関数のコンポーネントは、私がやろうとしていることについて私にはあまり明確ではなかったが、aggregate()のバリエーションをいくつか試しました。これはかなり簡単なことであると思われます(group_byはパーセントランクと関連ラベルの計算に役立ちました)が、まだ解決策を見つけることができませんでした。どんなヒントも大歓迎です!

+0

'dplyr'パッケージに' count'関数があります。たぶん役立つかもしれません。 – user2100721

+0

''の長さで十分ですが、論理ベクトルであれば、 'sum'がカウントを与えます。 – akrun

答えて

0

dcastdata.tableからもfun.aggregateがあり、非常に高速です。

library(data.table) 
dcast(setDT(alldata), site~Label, length) 

それとも

reshape(aggregate(date~site + Label, alldata, length), 
      idvar = "site", timevar="Label", direction="wide") 
+1

これは完璧です!私は 'dplyr'と' tidyr'パッケージに精通していますので、これは他のコードのフォーマットとよく似ています。 @akrunありがとう、と迅速な応答のすべてに。 – acersaccharum

1

dplyrでこれを行うには3つの方法がありますでしょうdplyr/tidyr

library(dplyr) 
library(tidyr) 
alldata %>% 
    group_by(site, Label) %>% 
    tally() %>% 
    spread(Label, n) 

base Rオプションを使用して。最初は最も詳細で、他の2つの使用便利な機能がコード短縮する:

library(reshape2) 
library(dplyr) 

alldata %>% group_by(site, Label) %>% summarise(n=n()) %>% dcast(site ~ Label) 

alldata %>% group_by(site, Label) %>% tally %>% dcast(site ~ Label) 

alldata %>% count(site, Label) %>% dcast(site ~ Label) 
1

だけサマリー表を作成するには、使用できtable

with(df, table(site, Label, useNA="ifany"))[, c(2,4,1,3)] 

    Label 
site Low Normal High N/A 
    01A 0  2 0 0 
    01B 2  0 0 0 
    01C 0  0 2 0 
    02A 0  0 0 1 
    02B 1  0 0 0 
    02C 0  1 0 0 

データを

df <- read.table(header=T, text="site date percent_rank Label 
01A 2013-01-01 0.32   Normal 
01B 2013-01-01 0.12   Low 
01C 2013-01-01 0.76   High 
02A 2013-01-01  0   N/A 
02B 2013-01-01 0.16   Low 
02C 2013-01-01 0.5   Normal 
01A 2013-01-02 0.67   Normal 
01B 2013-01-02 0.01   Low 
01C 2013-01-02 0.92   High") 
関連する問題