web-dev-qa-db-ja.com

各グループ内の行数を数える

データフレームがあり、各グループ内の行数をカウントしたいと思います。次のようにaggregate関数を使用してデータを合計します。

df2 <- aggregate(x ~ Year + Month, data = df1, sum)

さて、観測をカウントしたいのですが、FUNの適切な引数が見つからないようです。直感的には、次のようになると思いました。

df2 <- aggregate(x ~ Year + Month, data = df1, count)

しかし、そのような運はありません。

何か案は?


いくつかのおもちゃデータ:

set.seed(2)
df1 <- data.frame(x = 1:20,
                  Year = sample(2012:2014, 20, replace = TRUE),
                  Month = sample(month.abb[1:3], 20, replace = TRUE))
88
MikeTP

df2 <- count(x, c('Year','Month'))(plyrパッケージ)もあります

46
geotheory

@Joshuaの提案に従って、df = 2007およびYear = NovであるMonthデータフレーム内の観測値の数をカウントする方法の1つを次に示します(列であると仮定):

nrow(df[,df$YEAR == 2007 & df$Month == "Nov"])

@GregSnowに続くaggregateを使用:

aggregate(x ~ Year + Month, data = df, FUN = length)
53
Ben

dplyrも使用できます。

まず、いくつかのデータ:

df <- data.frame(x = rep(1:6, rep(c(1, 2, 3), 2)), year = 1993:2004, month = c(1, 1:11))

今カウント:

library(dplyr)
count(df, year, month)
#piping
df %>% count(year, month)

パイピングとn()関数で少し長いバージョンを使用することもできます。

df %>% 
  group_by(year, month) %>%
  summarise(number = n())

またはtally関数:

df %>% 
  group_by(year, month) %>%
  tally()
34
jeremycg

data.tableソリューションのない古い質問。だからここに行く...

.Nを使用する

library(data.table)
DT <- data.table(df)
DT[, .N, by = list(year, month)]
31
mnel

aggregateで使用する簡単なオプションは、サブセット内のベクトルの長さを指定するlength関数です。 function(x) sum( !is.na(x) )を使用することが、もう少し堅牢です。

21
Greg Snow

この場合のaggregate()関数の代替はtable()as.data.frame()で、これは年と月のどの組み合わせがゼロのオカレンスに関連付けられているかを示します

df<-data.frame(x=rep(1:6,rep(c(1,2,3),2)),year=1993:2004,month=c(1,1:11))

myAns<-as.data.frame(table(df[,c("year","month")]))

そして、ゼロ発生の組み合わせなし

myAns[which(myAns$Freq>0),]
16
BenBarnes

行ごとに値が1の新しい変数Countを作成します。

df1["Count"] <-1

次に、Count列で合計してデータフレームを集計します。

df2 <- aggregate(df1[c("Count")], by=list(year=df1$year, month=df1$month), FUN=sum, na.rm=TRUE)
16
Leroy Tyrone

データに欠落している月年の0カウントを含める場合は、少しのtableマジックを使用できます。

data.frame(with(df1, table(Year, Month)))

たとえば、質問df1のおもちゃdata.frameには、2014年1月の観測は含まれていません。

df1
    x Year Month
1   1 2012   Feb
2   2 2014   Feb
3   3 2013   Mar
4   4 2012   Jan
5   5 2014   Feb
6   6 2014   Feb
7   7 2012   Jan
8   8 2014   Feb
9   9 2013   Mar
10 10 2013   Jan
11 11 2013   Jan
12 12 2012   Jan
13 13 2014   Mar
14 14 2012   Mar
15 15 2013   Feb
16 16 2014   Feb
17 17 2014   Mar
18 18 2012   Jan
19 19 2013   Mar
20 20 2012   Jan

ベースR aggregate関数は、2014年1月の観測値を返しません。

aggregate(x ~ Year + Month, data = df1, FUN = length)
  Year Month x
1 2012   Feb 1
2 2013   Feb 1
3 2014   Feb 5
4 2012   Jan 5
5 2013   Jan 2
6 2012   Mar 1
7 2013   Mar 3
8 2014   Mar 2

カウントとして0を使用してこの月年の観測を希望する場合、上記のコードは、すべての月年の組み合わせのカウントを含むdata.frameを返します。

data.frame(with(df1, table(Year, Month)))
  Year Month Freq
1 2012   Feb    1
2 2013   Feb    1
3 2014   Feb    5
4 2012   Jan    5
5 2013   Jan    2
6 2014   Jan    0
7 2012   Mar    1
8 2013   Mar    3
9 2014   Mar    2
7
lmo

私の集計では、通常、平均と「このグループの大きさ」(別名長さ)を見たいと思うようになります。したがって、これはそれらの機会のための私の便利なスニペットです。

agg.mean <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="mean")
agg.count <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="length")
aggcount <- agg.count$columnToMean
agg <- cbind(aggcount, agg.mean)
4
maze

sqldfパッケージを使用した sql ソリューション:

library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
       FROM df1
       GROUP BY Year, Month")
2
M-M

@Benの回答を考慮すると、df1x列が含まれていない場合、Rはエラーをスローします。しかし、それはpasteでエレガントに解決できます:

aggregate(paste(Year, Month) ~ Year + Month, data = df1, FUN = NROW)

同様に、3つ以上の変数がグループ化に使用される場合、一般化できます。

aggregate(paste(Year, Month, Day) ~ Year + Month + Day, data = df1, FUN = NROW)
0
paudan

ここには素晴らしい答えがたくさんありますが、行が繰り返される回数を含む新しい列を元のデータセットに追加したい人のために、もう1つのオプションを追加したかったのです。

df1$counts <- sapply(X = paste(df1$Year, df1$Month), 
                     FUN = function(x) { sum(paste(df1$Year, df1$Month) == x) })

上記の回答のいずれかをmerge()関数と組み合わせることで、同じことが実現できます。

0
filups21

by関数をby(df1$Year, df1$Month, count)として使用して、必要な集計のリストを作成できます。

出力は次のようになります。

df1$Month: Feb
     x freq
1 2012    1
2 2013    1
3 2014    5
--------------------------------------------------------------- 
df1$Month: Jan
     x freq
1 2012    5
2 2013    2
--------------------------------------------------------------- 
df1$Month: Mar
     x freq
1 2012    1
2 2013    3
3 2014    2
> 
0
helcode