R for循环不起作用

时间:2013-08-08 22:12:25

标签: r

我正在尝试使用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

任何帮助将不胜感激!谢谢!

3 个答案:

答案 0 :(得分: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))

请参阅here以获取示例。

已更新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)]即可获得最大值的时间。

答案 1 :(得分: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函数(与tapplyaggregate不同)要求您将函数作为带FUN=function(.)的命名参数提供。这是我犯的常见错误。如果您看到“错误消息unique()仅适用于向量”,则它似乎是突然出现的,但意味着ave尝试对其预期为离散的参数进行分组,并为其提供了一个函数。 / p>

答案 2 :(得分:-2)

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

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

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

我建议您阅读apply()lapply()sapply()tapply()mapply()的帮助文档(我可能会忘记其中一个......) in和plyr包。