0

ちょっとしたバックグラウンド: 私は統計を通じてプログラミングを始めましたが、正式なプログラミング経験はあまりありません。物事を機能させる方法を知っているだけです。私は異なる方向からこれに来るための提案を受け入れていますが、現在、複数の sqldf クエリを使用して目的のデータを取得しています。私はもともと SAS で統計プログラミングを始めましたが、定期的に使用したものの 1 つはマクロ プログラミング機能でした。

簡単な例として、テーブル A が次のようになっているとします。

Name      Sex    A    B       DateAdded
John      M      72   1476    01/14/12
Sue       F      44   3269    02/09/12
Liz       F      90   7130    01/01/12
Steve     M      21   3161    02/29/12

私が現在使用している選択ステートメントは次の形式です。 sqldf("SELECT AVG(A), SUM(B) FROM A WHERE DateAdded >= '2012-01-01' AND DateAdded <= '2012-01-31'")

ここで、DateAdded が 2 月にあるエントリに対して同じクエリを実行したいと思います。私の SAS での経験から、DateAdded の値に対してマクロ変数を作成します。これを (非常に遅い) for ループとして実行することを検討しましたが、R 変数を sqldf に渡す方法、またはそれが可能かどうかさえわかりません。私のテーブルでは、何年にもわたるデータに対して同じクエリを使用しています。コードを合理化する方法は大歓迎です。

4

1 に答える 1

3

DateAddedデータを読み取り、列をクラスに変換し、 (年/月) 列をDate追加してから、 orを使用して年/月ごとに集計します。yearmonsqldfaggregate

Lines <- "Name      Sex    A    B       DateAdded
John      M      72   1476    01/14/12
Sue       F      44   3269    02/09/12
Liz       F      90   7130    01/01/12
Steve     M      21   3161    02/29/12"

DF <- read.table(text = Lines, header = TRUE)

# convert DateAdded column to Date class
DF$DateAdded <- as.Date(DF$DateAdded, format = "%m/%d/%y")

# add a year/month column using zoo
library(zoo)
DF$yearmon <- as.yearmon(DF$DateAdded)

これで、データとその適切な形式が得られたので、答えはたった 1 行のコードです。次の 2 つの方法があります。

# 1. using sqldf
library(sqldf)
sqldf("select yearmon, avg(A), avg(B) from DF group by yearmon")

# 2. using aggregate
aggregate(cbind(A, B) ~ yearmon, DF, mean)

最後の 2 行の結果は次のとおりです。

> sqldf("select yearmon, avg(A), avg(B) from DF group by yearmon")
   yearmon avg(A) avg(B)
1 Jan 2012   81.0   4303
2 Feb 2012   32.5   3215
> 
> # 2. using aggregate
> aggregate(cbind(A, B) ~ yearmon, DF, mean)
   yearmon    A    B
1 Jan 2012 81.0 4303
2 Feb 2012 32.5 3215

編集:

週ごとに行うという質問については、動物園のクイック リファレンス ビネットnextfriの機能を参照してください。

于 2012-07-06T18:49:26.733 に答える