2011-04-05 86 views
1

中获取降雨最大值的日期我有一个数据框,每年的降雨量(第1列中的完整日期,第2列中的月份,第3列中的降雨量)。我正在尝试计算每月的最大降雨量,并且我想知道发生最大值的日期。如何在编程语言R

我尝试下面的代码:

for (imonth in 1:12) { 
    month <- which(data[,2]==imonth) 
    monthly_max[imonth] <- max(data[month,3]) 
    maxi[imonth] <- which.max(data[month,3]) 
} 
tabela <- cbind(monthly_max, maxi) 
write.table(tabela, col.names=TRUE, row.names=TRUE, append=FALSE, sep="\t") 

每月最大的工作完美,但which.max功能不能正常工作。给我的行数不符合降雨的最大值。任何人都可以告诉我为什么或者可能提出一个更好的方法来做到这一点?

谢谢你的帮忙!

回答

1

下面是使用plyr包

library(plyr) 

# create a dummy data frame 
df = data.frame(date  = sample(LETTERS, 100, replace = T), 
       month = sample(12, 100, replace = T), 
       rainfall = sample(1000, 100, replace = F)); 

# use plyr to figure out max rainfall and date for each month 
df.max = ddply(df, .(month), summarize, 
      max.rain  = max(rainfall), 
      date.max.rain = date[which.max(rainfall)]) 

让我知道,如果这个工程可能的解决方案。

编辑。如果有多个日期,最大降雨,代码需要稍微修改

# find max rainfall for each month 
df.max = ddply(df, .(month), transform, max.rain = max(rainfall)) 

# extract subset such that max.rain = rainfall 
df.max = subset(df.max, max.rain == rainfall) 
+0

谢谢您的回答,我tryed您的解决方案,但我R中说得到一个错误信息:错误在日期[which.max(rainfall)]: 类型'closure'的对象不可子集 – sbg 2011-04-05 18:40:42

+0

它对我来说非常合适。你使用什么版本的R?你有安装plyr吗?你的数据框的列名是什么?我认为只需要一点小小的调整。 – Ramnath 2011-04-05 19:56:00

+0

我认为这个问题可能与R功能日期有冲突。尝试将列名称日期更改为date1并运行代码。它应该工作 – Ramnath 2011-04-05 19:57:47

0

指数功能效果很好这里:

library(zoo) 
data(AirPassengers) 
APZ = zoo(AirPassengers) 
ndx = which.max(APZ) 

dmax = index(APZ[ndx]) 
# returns '1960.5' which is Jul 1960 once you know the series freq 

frequency(APZ) 
# returns 12 

我假定你是一个工作时间序列对象;对于那些(使用例如ts,zooreg,xts创建的对象)日期实际上是价值指数。如果您有一个数据框(即,使得日期是数据框中的列,并且是另一列),那么您可以直接访问该行。

编辑根据OP的评论如下。对于存储为数据帧数据:

假设你的数据是这样的,一个数据帧,D0:

D0[1:10,] 
# returns 

      Time  Value 
1 2011-03-12 10:48:24 -3.077784 
2 2011-03-12 10:49:24 -20.145500 
3 2011-03-12 10:50:24 -45.047560 
4 2011-03-12 10:51:24 -69.949640 
5 2011-03-12 10:52:24 -94.571920 
6 2011-03-12 10:53:24 -112.199200 
7 2011-03-12 10:54:24 -118.914400 
8 2011-03-12 10:55:24 -114.997200 
9 2011-03-12 10:56:24 -97.369900 
10 2011-03-12 10:57:24 -78.063800 

ndx = which.max(D0$Value) 
dmax = D0[ndx,]   # dmax gives the date corresponding to the max value 
+0

嗨,谢谢你的回答,它不是时间序列对象,它是一个矩阵(日期确实是数据框中的一列,而降雨量是另一列)。我怎样才能直接访问我的降雨量的最大值? – sbg 2011-04-05 18:51:33

+0

编辑我的问题,根据你的问题 – doug 2011-04-05 19:38:59

+0

which.max是我最初尝试,但它不起作用,我认为“月”限制在“maxi [imonth] < - which.max(数据[月, 3])“不起作用,因为它不是给我月份最大值的日期,它给了我在1月份的随机行...... – sbg 2011-04-06 11:32:30