1

日付/時刻列とその日付/時刻に関連付けられた値を含む Excel csv があります。私は、この形式 (以下を参照) を通過するスクリプトを作成して、1) 1 日あたりの最大値、および 2) その日の最大値が発生する時刻を見つけようとしています。できれば、R は新しいデータフレームで両方の値を返します。

データは次のようになります。

         V1    V2 V3
1  5/1/2012  3:00  1
2  5/1/2012  6:00  2
3  5/1/2012  9:00  5
4  5/1/2012 12:00  3
5  5/1/2012 15:00  6
6  5/1/2012 18:00  2
7  5/1/2012 21:00  1
8  5/2/2012  0:00  2
9  5/2/2012  3:00  3
10 5/2/2012  6:00  6
11 5/2/2012  9:00  4
12 5/2/2012 12:00  6
13 5/2/2012 15:00  7
14 5/2/2012 18:00  9
15 5/2/2012 21:00  1

したがって、私が想定している関数は次を返します。

1 5/1/2012 15:00 6
2 5/2/2012 18:00 9

何か案は?

4

4 に答える 4

2

このような問題に対して非常にエレガントだと思うplyrパッケージを使用したソリューション。

dat.str <- '         V1    V2 V3
1  5/1/2012  3:00  1
2  5/1/2012  6:00  2
3  5/1/2012  9:00  5
4  5/1/2012 12:00  3
5  5/1/2012 15:00  6
6  5/1/2012 18:00  2
7  5/1/2012 21:00  1
8  5/2/2012  0:00  2
9  5/2/2012  3:00  3
10 5/2/2012  6:00  6
11 5/2/2012  9:00  4
12 5/2/2012 12:00  6
13 5/2/2012 15:00  7
14 5/2/2012 18:00  9
15 5/2/2012 21:00  1'

dat <- read.table(textConnection(dat.str), row.names=1, header=TRUE)

library(plyr)
ddply(dat, .(V1), function(x){
   x[which.max(x$V3), ]
})
于 2012-06-19T21:53:32.657 に答える
1

時系列データを扱っている場合は、zooまたはのような時系列クラスを使用することをお勧めしますxts

dat <- read.table(text="         V1    V2 V3
1  5/1/2012  3:00  1
2  5/1/2012  6:00  2
3  5/1/2012  9:00  5
4  5/1/2012 12:00  3
5  5/1/2012 15:00  6
6  5/1/2012 18:00  2
7  5/1/2012 21:00  1
8  5/2/2012  0:00  2
9  5/2/2012  3:00  3
10 5/2/2012  6:00  6
11 5/2/2012  9:00  4
12 5/2/2012 12:00  6
13 5/2/2012 15:00  7
14 5/2/2012 18:00  9
15 5/2/2012 21:00  1", row.names=1, header=TRUE)

require("xts")
# create an xts object
xobj <- xts(dat[, 3], order.by=as.POSIXct(paste(dat[, 1], dat[, 2]), format="%m/%d/%Y %H:%M"))

毎日の最大値を取得したいだけで、その日の最後の時刻をインデックスとして使用しても問題ない場合は、次を使用できますapply.daily

apply.daily(xobj, max)
#                    [,1]
#2012-05-01 21:00:00    6
#2012-05-02 21:00:00    9

それが発生したタイムスタンプを保持するには、これを行うことができます

do.call(rbind, lapply(split(xobj, "days"), function(x) x[which.max(x), ]))
#                    [,1]
2012-05-01 15:00:00    6
2012-05-02 18:00:00    9

split(xobj, "days")各要素に 1 日のデータを含むリストを作成します。

lapply毎日に関数を適用します。この場合、関数は単純maxに各日の観測値を返します。このlapply呼び出しはlistxts オブジェクトの a を返します。単一の xts オブジェクトに戻すには、 を使用しますdo.call

do.call(rbind, X)リストの各要素を使用して rbind への呼び出しを構築します。と同等ですrbind(X[[1]], X[[2]], ..., X[[n]])

于 2012-06-19T22:27:10.563 に答える
1

別の方法として、次を使用できますdata.table

dat_table <- data.table(dat)

dat_table [ , list(is_max = V3==max(V3), V2, V3), by= 'V1'][which(is_max),][,is_max :=NULL]

@MattDowleのコメントに従って編集

dat_table[, .SD[which.max(V3)], by=V1]

さらに簡単なdata.table解決策のために。

于 2012-06-20T05:36:29.800 に答える
0

どうぞ:

dat.str <- '         V1    V2 V3
1  5/1/2012  3:00  1
2  5/1/2012  6:00  2
3  5/1/2012  9:00  5
4  5/1/2012 12:00  3
5  5/1/2012 15:00  6
6  5/1/2012 18:00  2
7  5/1/2012 21:00  1
8  5/2/2012  0:00  2
9  5/2/2012  3:00  3
10 5/2/2012  6:00  6
11 5/2/2012  9:00  4
12 5/2/2012 12:00  6
13 5/2/2012 15:00  7
14 5/2/2012 18:00  9
15 5/2/2012 21:00  1'

dat <- read.table(textConnection(dat.str), row.names=1, header=TRUE)

do.call(rbind, 
        by(dat, INDICES=dat$V1, FUN=function(x) tail(x[order(x$V3), ], 1)))
于 2012-06-19T21:49:26.097 に答える