データフレームがあり、各グループ内の行数をカウントしたいと思います。次のように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))
df2 <- count(x, c('Year','Month'))
(plyrパッケージ)もあります
@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)
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()
data.table
ソリューションのない古い質問。だからここに行く...
.N
を使用する
library(data.table)
DT <- data.table(df)
DT[, .N, by = list(year, month)]
aggregate
で使用する簡単なオプションは、サブセット内のベクトルの長さを指定するlength
関数です。 function(x) sum( !is.na(x) )
を使用することが、もう少し堅牢です。
この場合の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),]
行ごとに値が1の新しい変数Count
を作成します。
df1["Count"] <-1
次に、Count
列で合計してデータフレームを集計します。
df2 <- aggregate(df1[c("Count")], by=list(year=df1$year, month=df1$month), FUN=sum, na.rm=TRUE)
データに欠落している月年の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
私の集計では、通常、平均と「このグループの大きさ」(別名長さ)を見たいと思うようになります。したがって、これはそれらの機会のための私の便利なスニペットです。
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)
sqldf
パッケージを使用した sql ソリューション:
library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
FROM df1
GROUP BY Year, Month")
@Benの回答を考慮すると、df1
にx
列が含まれていない場合、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)
ここには素晴らしい答えがたくさんありますが、行が繰り返される回数を含む新しい列を元のデータセットに追加したい人のために、もう1つのオプションを追加したかったのです。
df1$counts <- sapply(X = paste(df1$Year, df1$Month),
FUN = function(x) { sum(paste(df1$Year, df1$Month) == x) })
上記の回答のいずれかをmerge()
関数と組み合わせることで、同じことが実現できます。
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
>