我有两个数据框架:每天收集的降雨数据和不定期收集的硝酸盐浓度,大约每月一次。I要为每个硝酸盐浓度创建一个向量,即前5天降雨量的总和,基本上需要将硝酸盐日期与降雨日期相匹配,并将前5天的降雨量之和,然后用硝酸盐数据打印和。
我想我需要做一个function,一个for循环,或者使用tapply来完成这个任务,但是我不知道怎么做。我不是这些方面的专家,尽管我在简单的案例中使用过它们。我曾搜索过类似的帖子,但没有人能准确地理解这一点。This one处理因子组的求和。This one处理每对可能的行的求和。This one负责aggregate的总结。
下面是两个示例数据帧:
# rainfall df
mm<- c(0,0,0,0,5, 0,0,2,0,0, 10,0,0,0,0)
date<- c(1:15)
rain <- data.frame(cbind(mm, date))
# b/c sums of rainfall depend on correct chronological order, make sure the data are in order by date.
rain[ do.call(order, list(rain$date)),]
# nitrate df
nconc <- c(15, 12, 14, 20, 8.5) # nitrate concentration
ndate<- c(6,8,11,13,14)
nitrate <- data.frame(cbind(nconc, ndate))我想找出每一次硝酸盐测量的对应降雨日期,例如:
match(nitrate$date[i] %in% rain$date)(注:match是否适用于as.Date日期?)然后将前5天的降雨量(不包括测量日期)相加,例如:
sum(rain$mm[j-6:j-1]并在一个新的列中以硝酸盐打印和。
print(nitrate$mm_sum[i])为了确定我要寻找的结果是什么,下面是如何进行手工计算。在第6天采集第一次硝酸盐浓度,第1~5天降雨量之和为5mm。
在此之前,非常感谢您。
发布于 2016-11-07 15:10:34
你或多或少都在那里!
nitrate$prev_five_rainfall = NA
for (i in 1:length(nitrate$ndate)) {
day = nitrate$ndate[i]
nitrate$prev_five_rainfall[i] = sum(rain$mm[(day-6):(day-1)])
}逐步解释:
初始化空结果列:
nitrate$prev_five_rainfall = NA 对于硝酸盐df中的每一行:(i = 1,2,3,4,5)
for (i in 1:length(nitrate$ndate)) { 抓住我们想要的最终结果的一天:
day = nitrate$ndate[i] 取雨满和,并将其放入结果栏。
nitrate$prev_five_rainfall[i] = sum(rain$mm[(day-6):(day-1)])关闭for循环:)
}免责声明:这个答案是基本的,因为:
随着您对R获得更多的经验,您可能会使用像dplyr或data.table这样的数据操作包来处理这些类型的操作。
发布于 2016-11-08 08:48:06
@nelsonauner的答案会带来很大的压力。但有一点要注意的是,在我的实际数据中,我的日期并不像上面的例子那样是数字的,它们是用适当的as.Date(nitrate$date, "%m/%d/%Y")列出的MM/DD/YYYY的日期。
我发现上面的for循环为nitrate$prev_five_rainfall提供了所有的零,我怀疑这是日期的问题。
因此,我将两个数据集中的日期更改为数字,使用公共开始日期和记录日期之间的天数差异,这样for循环将在每个数据帧中寻找匹配的天数,而不是日期。首先,使用rep_len()创建一列开始日期,并对其进行格式化:
nitrate$startdate <- rep_len("01/01/1980", nrow(nitrate))
nitrate$startdate <- as.Date(all$startdate, "%m/%d/%Y")然后,使用difftime()计算差额。
nitrate$diffdays <- as.numeric(difftime(nitrate$date, nitrate$startdate, units="days"))对rain数据帧也这样做。最后,for循环如下所示:
nitrate$prev_five_rainfall = NA
for (i in 1:length(nitrate$diffdays)) {
day = nitrate$diffdays[i]
nitrate$prev_five_rainfall[i] = sum(rain$mm[(day-5):(day-1)]) # 5 days
}https://stackoverflow.com/questions/40467987
复制相似问题