したがって、日付列、時間列、およびその他の一連の数値列を持つデータフレームがあります。データフレームの各行は、1年間で1日の1時間です。
データフレームは次のようになります。
Date Hour Melbourne Southern Flagstaff
1 2009-05-01 0 0 5 17
2 2009-05-01 2 0 2 1
3 2009-05-01 1 0 11 0
4 2009-05-01 3 0 3 8
5 2009-05-01 4 0 1 0
6 2009-05-01 5 0 49 79
7 2009-05-01 6 0 425 610
これは別のデータフレームからサブセット化されているため、時間は順不同です。
数値列の値を月ごとに、場合によっては日ごとに合計したいと思います。誰かが私がこれを行う方法を知っていますか?
によってデータセットを作成します
_data <- read.table( text=" Date Hour Melbourne Southern Flagstaff
1 2009-05-01 0 0 5 17
2 2009-05-01 2 0 2 1
3 2009-05-01 1 0 11 0
4 2009-05-01 3 0 3 8
5 2009-05-01 4 0 1 0
6 2009-05-01 5 0 49 79
7 2009-05-01 6 0 425 610",
header=TRUE,stringsAsFactors=FALSE)
_
関数aggregate
を使用して合計を行うことができます。
_byday <- aggregate(cbind(Melbourne,Southern,Flagstaff)~Date,
data=data,FUN=sum)
library(lubridate)
bymonth <- aggregate(cbind(Melbourne,Southern,Flagstaff)~month(Date),
data=data,FUN=sum)
_
関数をよりよく理解するには、_?aggregate
_を見てください。最後の引数から始めて(説明が簡単になるため)、引数は次のようになります。
FUN
は、集計に使用する必要のある関数です。 sum
を使用して値を合計しますが、mean
、max
、または自分で作成した関数にすることもできます。data
は、集約するデータフレームを示すために使用されます。~
_の左側に、集計する変数を示します。複数ある場合は、cbind
と組み合わされます。右側は、データを分割するための変数です。 Date
を置くことは、aggregateがDate
の個別の値ごとに変数を合計することを意味します。月ごとの集計には、パッケージmonth
の関数lubridate
を使用しました。期待どおりの動作をします。特定の日付の月を示す数値を返します。たぶん、最初にinstall.packages("lubridate")
でパッケージをインストールする必要があります。
Lubridateを使用したくない場合は、代わりに次のようにすることができます。
_data <- transform(data,month=as.numeric(format(as.Date(Date),"%m")))
bymonth <- aggregate(cbind(Melbourne,Southern,Flagstaff)~month,
data=data,FUN=sum)
_
ここでは、月を含むデータに新しい列を追加し、その列で集計しました。
これは、data.table
を使用してこれを行う別の方法である可能性があります
library(data.table)
# Edited as per Arun's comment
out = setDT(data)[, lapply(.SD, sum), by=Date]
#>out
# Date Hour Melbourne Southern Flagstaff
#1: 2009-05-01 21 0 496 715
またはdplyr
を使用して
library(dplyr)
out = data %>% group_by(Date) %>% summarise_each(funs(sum))
#>out
#Source: local data frame [1 x 5]
# Date Hour Melbourne Southern Flagstaff
#1 2009-05-01 21 0 496 715
別のベースRソリューション
# to sum by date
rowsum(dat[-1], dat$Date)
# Hour Melbourne Southern Flagstaff
#2009-05-01 21 0 496 715
# or by month and year
rowsum(dat[-1], format(dat$Date, "%b-%y") )
# Hour Melbourne Southern Flagstaff
#May-09 21 0 496 715
Dplyr :: summaryとgroup_byを使用し、各数値列の合計を指定します。
summarize(group_by(df, Date), m_count = sum(Melbourne), s_count = sum(Southern), f_count = sum(Flagstaff)