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

更新1:如果您的日期是 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))

请参阅此处的示例。

更新2:根据新数据:如果您的一天与您更新的那一天一样,则无需执行任何操作。您可以使用以下代码:

    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一天的数据子集。由于我只从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

另请注意,该ave函数(与tapplyor不同aggregate)要求您将函数作为命名参数提供FUN=function(.)。这是我犯的一个常见错误。如果您看到“错误消息 unique() 仅适用于向量”,这似乎是出乎意料的,但这意味着ave试图对一个预期为离散的参数进行分组,并且您给了它一个函数。

于 2013-08-09T00:29:58.403 回答
-2

与其他编程语言不同,在 R 中,避免使用 for 循环被认为是一种很好的做法。而是尝试类似:

index <- sapply(Days, function(x) {
    which.max(Value)
})
theData[index, c("Day", "Time", "Value")]

这意味着对于 的每个值Days,找到 的最大值Value并返回其索引。然后您可以选择感兴趣的行和列。

我建议阅读包装中的apply(), lapply(), sapply(), tapply(),的帮助文档 mapply()(我可能忘记了其中一个……) 。plyr

于 2013-08-08T22:22:28.410 回答