2016-08-02 53 views
1

以下行的特定數量的總和我必須解決R.這一特定問題我有一個大名單,包含這種格式的行和列:獲取R中

Day_and_Time Rain1_mm/min Rain2_mm/min 
    01.12.10 18:01  0    0 
    .............. ....   ... 
    02.12.10 01:00 0.03    0    
    02.12.10 01:01 0.03    0   
    02.12.10 01:02 0.01    0   
    02.12.10 01:03 0.05    0   
    02.12.10 01:04 0.03   0.1   
    02.12.10 01:05 0.04    0 
    .............. ....   ... 
    02.12.10 18:00  0    0 

我想什麼做的是編寫一個函數,總結了以下六行,並將結果作爲新行返回。這意味着最後我有一個新的列表 - 看起來像這樣,例如:

Day_and_Time   Rain1_mm/5min Rain2_mm/5min 
    ..............   ....   ... 
    02.12.10 01:05   0.19   0.1   
    02.12.10 01:10   ....   ... 
    ..............   ....   ... 

是否有可能這樣做?目標是將單位[mm/min]從第一列和第二列轉換爲[mm/5min]。

非常感謝!

+0

你每分鐘都有一排嗎? – aichao

+0

是的,從01.12.10 18:01到02.12.10 18:00。所以23小時,總共59分鐘! – Frosi

+1

絕對有可能。如果你提供了一些數據來產生使用dput()的解決方案,那將會很好。 – snoram

回答

0

假設你在.csv文件作爲數據幀df讀取數據,一個辦法你的問題是使用rollapplyzoo包,給你一個滾動的總和:

library(zoo) 

ind_keep <- seq(1,floor(nrow(df)/5)*5, by=5)      ## 1. 
out <- sapply(df[,-1], function(x) rollapply(x,6,sum))    ## 2. 
out <- data.frame(df[ind_keep+5,1],out[ind_keep,])     ## 3. 
colnames(out) <- c("Day_and_time","Rain1_mm/5min","Rain2_mm/5min") ## 4. 

注:

  1. 在這裏,我們定義了每隔5分鐘對應的指數,我們希望在接下來的5分鐘內保持滾動總和。
  2. 爲每列應用滾動和功能。
    • df的所有列上使用sapply這不是第一列。請注意,可以調整df[,-1]中指定的列索引,以便僅處理特定列。
    • 要應用的函數是zoo包中的rollapply。附加參數是窗口的寬度5sum函數,以便執行滾動和。 在這一點上,out包含在每分鐘的滾動金額(超過5分鐘),但我們只需要每5分鐘一次。因此,
  3. 結合了從原來的dfoutDay_and_time柱只保留那些列,每5分鐘。請注意,我們在每個窗口中保留最後的Day_and_Time
  4. 這只是重新命名列。

使用MikeyMike的數據,這是

  Day_and_Time rain1 rain2 
1 2010-02-12 01:00:00 0.03 0.00 
2 2010-02-12 01:01:00 0.03 0.00 
3 2010-02-12 01:02:00 0.01 0.00 
4 2010-02-12 01:03:00 0.05 0.00 
5 2010-02-12 01:04:00 0.03 0.10 
6 2010-02-12 01:05:00 0.04 0.00 
7 2010-02-12 01:06:00 0.02 0.10 
8 2010-02-12 01:07:00 0.10 0.10 
9 2010-02-12 01:08:00 0.30 0.00 
10 2010-02-12 01:09:00 0.01 0.00 
11 2010-02-12 01:10:00 0.00 0.01 

這給:

print(out) 
##   Day_and_time Rain1_mm/5min Rain2_mm/5min 
##1 2010-02-12 01:05:00   0.19   0.10 
##2 2010-02-12 01:10:00   0.47   0.21 

注意在結果的差異,這種方法假定你想,因爲你指定要重疊窗口在每隔5分鐘標記處關閉間隔[i,i+5]之間的六個數字相加。


向上述延伸到窗口在閉區間[i, i+nMin]在每個nMin馬克:

library(zoo) 
nMin <- 10  ## for example 10 minutes 
ind_keep <- seq(1, floor(nrow(df)/nMin)*nMin, by=nMin) 
out <- sapply(df[,-1], function(x) rollapply(x, nMin+1, sum)) 
out <- data.frame(df[ind_keep+nMin, 1],out[ind_keep,]) 
colnames(out) <- c("Day_and_time",paste0("Rain1_mm/",nMin,"min"),paste0("Rain2_mm/",nMin,"min")) 

對於這項工作,該數據必須至少有2 * nMin + 1

希望這幫助。

+0

爲了得到單位毫米/ 10分鐘,我必須改變什麼?所以如何總結10行?我可以寫[我,我+ 10]嗎? – Frosi

+0

@Frosi:請參閱我的更新。 – aichao

0

假設你要組爲0 - 5分鐘,6 - 10分鐘後,等這應該給你,你找什麼:

library(data.table) 
setDT(df)[,.(day_time = max(Day_and_Time), 
      rain1_sum=sum(rain1), 
      rain2_sum=sum(rain2)), 
      by=.(floor(as.numeric(Day_and_Time)/360))] 

    floor   day_time rain1_sum rain2_sum 
1: 3516540 2010-02-12 01:05:00  0.19  0.10 
2: 3516541 2010-02-12 01:10:00  0.43  0.21 

數據

df <- structure(list(Day_and_Time = structure(c(1265954400, 1265954460, 
1265954520, 1265954580, 1265954640, 1265954700, 1265954760, 1265954820, 
1265954880, 1265954940, 1265955000), class = c("POSIXct", "POSIXt" 
), tzone = ""), rain1 = c(0.03, 0.03, 0.01, 0.05, 0.03, 0.04, 
0.02, 0.1, 0.3, 0.01, 0), rain2 = c(0, 0, 0, 0, 0.1, 0, 0.1, 
0.1, 0, 0, 0.01)), .Names = c("Day_and_Time", "rain1", "rain2" 
), row.names = c(NA, -11L), class = c("data.table", "data.frame" 
), .internal.selfref = <pointer: 0x0000000000240788>)