web-dev-qa-db-ja.com

Rの月ごとの行の合計

したがって、日付列、時間列、およびその他の一連の数値列を持つデータフレームがあります。データフレームの各行は、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

これは別のデータフレームからサブセット化されているため、時間は順不同です。

数値列の値を月ごとに、場合によっては日ごとに合計したいと思います。誰かが私がこれを行う方法を知っていますか?

11
user2787386

によってデータセットを作成します

_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を使用して値を合計しますが、meanmax、または自分で作成した関数にすることもできます。
  • 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)
_

ここでは、月を含むデータに新しい列を追加し、その列で集計しました。

10
Stibu

これは、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
9

別のベース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
5
user20650

Dplyr :: summaryとgroup_byを使用し、各数値列の合計を指定します。

summarize(group_by(df, Date), m_count = sum(Melbourne), s_count = sum(Southern), f_count = sum(Flagstaff)
0
mvinton