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


121

データフレームがあり、各グループ内の行数をカウントしたいと思います。私は通常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))

17
nrowNROWlength...
ジョシュア・ウルリッヒ

15
私はこの質問を読み続けて、物事を数える楽しい方法を求めていると思います(多くの楽しい方法とは対照的に)。
Hong Ooi

6
@JoshuaUlrich:nrow私にはうまくいきませんでしたがNROWlengthうまくいきました。+1
Prolix

回答:


69

現在のベストプラクティス(tidyverse)は次のとおりです。

require(dplyr)
df1 %>% count(Year, Month)

変数を集計してカウントする方法はありますか(集計の2つの関数のように:平均+カウント)?列の平均と他の列の同じ値の行数を取得する必要があります
sop

1
私がいただきたいcbindの結果aggregate(Sepal.Length ~ Species, iris, mean)aggregate(Sepal.Length ~ Species, iris, length)
geotheory

実行しましたが、集計された列を除いて、各列に2回表示されるようです。それで私はそれらをマージしました、そしてそれは大丈夫であるようです
sop

6
わかりませんが、これも役に立つかもしれません...df %>% group_by(group, variable) %>% mutate(count = n())
Manoj Kumar

1
はい、dplyrは現在ベストプラクティスです。
地球理論2016

67

df@Joshua の提案に従い、データフレーム内の観測値の数をカウントする1つの方法をここに示します。ここでYear= 2007とMonth= Nov(それらが列であると仮定):

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

aggregate、@ GregSnowに従って:

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

47

dplyrパッケージはこれをcount/ tallyコマンドまたはn()関数で行います

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

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()

37

data.table解決策のない古い質問。だからここに行く...

使用する .N

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

1
使用して、今日の標準.()の代わりlist()setDT()data.tableにdata.frameを変換します。したがって、1つのステップでsetDT(df)[, .N, by = .(year, month)]
sindri_baldur

23

で使用するための簡単なオプションがaggregateあるlengthあなたのサブセット内のベクトルの長さを与える機能。時には、もう少し堅牢なものを使用することもできますfunction(x) sum( !is.na(x) )


18

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

df1["Count"] <-1

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

df2 <- aggregate(df1[c("Count")], by=list(Year=df1$Year, Month=df1$Month), FUN=sum, na.rm=TRUE)

のデフォルトの非式メソッドを使用している場合は、like などでaggregate各変数の名前を変更する必要がないことに注意してください。A はすでに機能しているので機能します。by=list(year=df1$year)data.framelistaggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)
thelatemail

17

aggregate()この場合の関数の代替は、table()withです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),]

7

データで欠落している月年のカウントを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

5

私の集計では、通常、平均と「このグループの大きさ」(長さ)を確認する必要があります。これは、これらの場合に便利なスニペットです。

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

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

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

1

@Benの回答を考えると、Rに列df1が含まれていない場合、エラーがスローされxます。しかし、それはエレガントに解決できます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

必要な集計のリストを生成する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

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

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

上記の答えのいずれかとmerge()関数を組み合わせることによって同じことが達成できます。


0

上記の集計ソリューションを試してエラーが発生した場合:

変数のタイプ(リスト)が無効です

日付または日時スタンプを使用しているため、変数にas.characterを使用してみてください。

aggregate(x ~ as.character(Year) + Month, data = df, FUN = length)

変数の一方または両方。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.