2016-08-02 56 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>)