r - 数据框修改 - 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 .b
df[2, 2]
df[4, 2]
然后,通过将(列中的下一个非缺失值)df[5-8, 3]
处的数字除以数字来填充值,表示从出现在(=前一个 NON- 之后的第一行)的列中开始的所有先前行的总和处的缺失值)到下一个非缺失值(包括),即 0.1/4 = 0.025。df[8, 2]
NA
b
df[5, 2]
NA
df[4, 2]
df[8, 2]
最后, atdf[9, 3]
的值等于 at 的值,df[9,2]
因为在 at 的数字之前有任何非缺失值df[9,2]
。
有没有人愿意帮我写代码?
先感谢您。
解决方案
iod 给出了相当广泛的答案,但我认为它可以做得更短。
我们只需要知道在哪些位置有非NA
s,但它们的实际值是多少并不重要。然后我们可以用它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)]
推荐阅读
- java - Jasypt 加密 - 加密时删除斜线
- cypress - 如何使用赛普拉斯获取元素类型 =“电子邮件”?
- javascript - 如何访问对象数组中嵌套对象的 JSON 属性
- python - 月份的正确顺序 Python
- swift - 我的 UIViewController 中出现了额外的空白
- c# - Microsoft.Data.ConnectionUI.DataConnectionDialog
- visual-studio - 无法使用 Web 部署将网站发布到服务器
- javascript - javascript中的for循环数组
- sql-server - SQL:如何在数据库中的所有视图中搜索 ID 并列出提供结果的视图和列名称?
- c++ - 为什么我只为 bool 和 int 而不是 double 获得 -Wunused-lambda-capture?