0

R を使用して、1 日から n 日までの各日の最大値を見つけようとしています。私の問題は、毎日複数の値があることです。これが私のコードです。実行した後、次元の数が正しくありません。

助言がありますか:

 Days <- unique(theData$Date)    #Gets each unique Day
 numDays <- length(Days)          
 Time <- unique(theData$Time)     #Gets each unique time
 numTime <- length(Time)
 rowCnt <- 1


 for (i in 1:numDays)  #Do something for each individual day. In this case find max
    {

         temp <- which(theData[i]$Date == numDays[i])
         temp <- theData[[i]][temp,]
         High[rowCnt, (i-2)+2] <- max(temp$High)  #indexing for when I print to CSV
         rowCnt <- rowCnt + 1 
     }

出てくるべきものは次のとおりです: 1 から n 日と時間を除いて。

Day       Time       Value 
 20130310 09:30:00    5   
20130310  09:31:00    1 
20130310   09:32:00    2
20130310    09:33:00    3
20130311   09:30:00    12
20130311   09:31:00    0
20130311   09:32:00    1
20130311   09:33:00    5
so this should return:

day time value
20130310   09:33:00    3
20130311   09:30:00   12

どんな助けでも大歓迎です!ありがとう!

4

3 に答える 3

2

これがplyrパッケージを使用したソリューションです

mydata<-structure(list(Day = structure(c(2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L), .Label = c("", "x", "y"), class = "factor"), Value = c(0L, 
1L, 2L, 3L, 12L, 0L, 1L, 5L), Time = c(5L, 6L, 7L, 8L, 1L, 2L, 
3L, 4L)), .Names = c("Day", "Value", "Time"), row.names = c(NA, 
8L), class = "data.frame")
library(plyr)
ddply(mydata,.(Day),summarize,max.value=max(Value))

  Day max.value
1   x         3
2   y        12

Updated1:あなたの日が 10/02/2012 12:00:00 AM である場合、次を使用する必要があります。

mydata$Day<-with(mydata,as.Date(Day, format = "%m/%d/%Y"))
ddply(mydata,.(Day),summarize,max.value=max(Value))

例はこちらをご覧ください。

Updated2:新しいデータによると: あなたの一日があなたが更新したものと同じなら、何もする必要はありません。次のようにコードを使用できます。

    mydata1<-structure(list(Day = c(20130310L, 20130310L, 20130310L, 20130310L, 
    20130311L, 20130311L, 20130311L, 20130311L), Time = structure(c(1L, 
    2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("9:30:00", "9:31:00", 
    "9:32:00", "9:33:00"), class = "factor"), Value = c(5L, 1L, 2L, 
    3L, 12L, 0L, 1L, 5L)), .Names = c("Day", "Time", "Value"), class = "data.frame", row.names = c(NA, 
    -8L))



ddply(mydata,.(Day),summarize,Time=Time[which.max(Value)],max.value=max(Value))
       Day    Time max.value
1 20130310 9:30:00         5
2 20130311 9:30:00        12

出力に時間を表示したい場合はTime=Time[which.max(Value)]、最大値の時間を与える which を使用してください。

于 2013-08-08T22:14:10.980 に答える
1

これは基本関数アプローチです。

> do.call( rbind, lapply(split(dfrm, dfrm$Day), 
                         function (df) df[ which.max(df$Value), ] ) )
              Day     Time Value
20130310 20130310 09:30:00     5
20130311 20130311 09:30:00    12

何が起こっているのかを説明するために、R 関数を裏返しに読むことを学ぶのは良いことです (それらは互いに構築されていることが多いためです)。の行、.... または、私が行ったルートをたどって、問題を で分割することができますDay。それsplitがデータフレームで行うことです。which.max次に、各データフレーム内で、1 日分のデータのサブセットだけに関数を適用しました。結果はデー​​タフレームのリストとしてしか得られなかったのでlapply、それらをまとめて押しつぶす必要がありました。そのための典型的な方法はdo.call(rbind, ...).

データフレーム全体に適用される選択用のベクトルを作成する別のルートを使用した場合、次を使用しますave

> dfrm[ with(dfrm, ave(Value, Day, FUN=function(v) v==max(v) ) ) , ]
         Day     Time Value
1   20130310 09:30:00     5
1.1 20130310 09:30:00     5

は?そうじゃない…何が問題なの?

with(dfrm, ave(Value, Day, FUN=function(v) v==max(v) ) )
[1] 1 0 0 0 1 0 0 0

したがって、「==」関数で論理ベクトルを要求したにもかかわらず、数値ベクトルに変換されましたが、まだ理解できていません。しかし、その結果の外側の論理に変換すると、再び成功します。

> dfrm[ as.logical( with(dfrm, ave(Value, Day, 
                                   FUN=function(v) v==max(v) ) ) ), ]
       Day     Time Value
1 20130310 09:30:00     5
5 20130311 09:30:00    12

また、関数は ( oraveとは異なり) で名前付き引数として関数を提供する必要があることに注意してください。それは私が犯すよくある間違いです。"エラー メッセージ unique() はベクトルにのみ適用されます" が表示された場合、それは不自然に思えますが、離散であると予想される引数をグループ化しようとして、関数を指定したことを意味します。tapplyaggregateFUN=function(.)ave

于 2013-08-09T00:29:58.403 に答える