我必须在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 :(得分:0)
假设您将.csv
文件中的数据作为数据框df
阅读,问题的一种解决方法是使用rollapply
包中的zoo
来提供你是一个滚动的总和:
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.
注意:
sapply
的不是第一列的所有列上使用df
。请注意,可以调整df[,-1]
中指定的列索引,以便您只处理某些列。rollapply
包的zoo
。附加参数是窗口5
和sum
函数的宽度,以便执行滚动总和。
此时,out
包含每分钟的滚动总和(超过5分钟),但我们只需要每5分钟一次。因此,Day_and_time
中的df
列与out
合并,每5分钟仅保留一列。请注意,我们会在每个窗口中保留最后一个Day_and_Time
。使用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
行
希望这有帮助。
答案 1 :(得分:0)
假设您希望这些组为0 - 5分钟,6 - 10分钟等,这应该可以为您提供所需的信息:
clang
数据强>:
g++