首页 > 解决方案 > 数据框修改 - R 中的降雨强度

问题描述

我一直在使用以下数据(仅代表整个数据集的一部分):

a <- seq(ISOdatetime(2017,08,18,0,0,0), ISOdatetime(2017,08,18,0,8,0), "min")
b <- c(0.1, NA, NA, 0.1, NA, NA, NA, 0.1, 0.1)
df <- data.frame(a, b)
                    a   b
1 2017-08-18 00:00:00 0.1
2 2017-08-18 00:01:00  NA
3 2017-08-18 00:02:00  NA
4 2017-08-18 00:03:00 0.1
5 2017-08-18 00:04:00  NA
6 2017-08-18 00:05:00  NA
7 2017-08-18 00:06:00  NA
8 2017-08-18 00:07:00 0.1
9 2017-08-18 00:08:00 0.1

该列b表示降雨高度 [mm] 的测量值。我需要得到以下结果:

                    a   b     c
1 2017-08-18 00:00:00 0.1 0.100
2 2017-08-18 00:01:00  NA 0.033
3 2017-08-18 00:02:00  NA 0.033
4 2017-08-18 00:03:00 0.1 0.033
5 2017-08-18 00:04:00  NA 0.025
6 2017-08-18 00:05:00  NA 0.025
7 2017-08-18 00:06:00  NA 0.025
8 2017-08-18 00:07:00 0.1 0.025
9 2017-08-18 00:08:00 0.1 0.100 

这些列c表示修改后的列b,如下所示:

这些值df[2-4, 3]由放置的数字除以数字来填充,该数字表示从出现在下一个非缺失值(包括)df[4, 2]的列中包含 NA 的第一行开始的所有先前行的数量,即 0.1/3 = 0.033 .bdf[2, 2]df[4, 2]

然后,通过将(列中的下一个非缺失值)df[5-8, 3]处的数字除以数字来填充值,表示从出现在(=前一个 NON- 之后的第一行)的列中开始的所有先前行的总和处的缺失值)到下一个非缺失值(包括),即 0.1/4 = 0.025。df[8, 2]NAbdf[5, 2]NAdf[4, 2]df[8, 2]

最后, atdf[9, 3]的值等于 at 的值,df[9,2]因为在 at 的数字之前有任何非缺失值df[9,2]

有没有人愿意帮我写代码?

先感谢您。

标签: rdataframe

解决方案


iod 给出了相当广泛的答案,但我认为它可以做得更短。

我们只需要知道在哪些位置有非NAs,但它们的实际值是多少并不重要。然后我们可以用它diff来查看拉伸的长度,我们可以计算每一行的分子和分母。我的第一个代码:

 counts <- diff(c(which(!is.na(b)), length(b)+1))
 num <- unlist(Map(rep, b[!is.na(b)], counts))
 denom <- unlist(Map(rep, counts, counts))
 result <- c(b[1], num/denom)[1:length(b)]

编辑:更正

原来我没有仔细阅读你的问题,所以我的回答有点错误。原始代码向上看,第 2 行到第 4 行取决于 b 列第 1 行中的值。 但是你需要它向下看,所以我更正的代码

counts <- diff(c(0, which(!is.na(b))))
num <- unlist(Map(rep, b[!is.na(b)], counts))
denom <- unlist(Map(rep, counts, counts))
result <- c(num/denom)[1:length(b)]

推荐阅读