我正在尝试使用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
任何帮助将不胜感激!谢谢!
答案 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
函数(与tapply
或aggregate
不同)要求您将函数作为带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
包。