2011-04-05 100 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