对于每个单独的stormMark值,我要计算从flow列中的最后一个非零数开始的天数。下面是我的数据示例:
> head(newdat)
dates station flow stormMark
1 2008-01-01 09512162 20 1
2 2008-01-02 09512162 0 NA
3 2008-01-03 09512162 5 NA
4 2008-01-04 09512162 0 NA
5 2008-01-05 09512162 0 NA
6 2008-01-06 09512162 3.5 2
所需的输出将如下所示:
stormMark days.since.flow
1 NA
2 3
发布于 2018-06-09 07:37:33
使用tidyverse
和difftime
的一种解决方案可以通过使用前一个dates
填充non_zero_flow_date
来实现,前提是前一个dates
不是零。如果之前的flow
为0
,则将non_zero_flow_date
设置为NA
。使用tidyr::fill
填充non_zero_flow_date
列的NA
值。最后,通过difftime
函数得到dates
和non_zero_flow_date
之间的差异。
library(tidyverse)
df %>% mutate(dates = as.Date(dates)) %>%
mutate(non_zero_flow_date =
as.Date(ifelse(lag(flow) == 0, NA, lag(dates)),origin="1970-01-01")) %>%
fill(non_zero_flow_date) %>%
mutate(days.since.flow = difftime(dates, non_zero_flow_date, units = "days")) %>%
filter(!is.na(stormMark)) %>%
select(stormMark, days.since.flow)
# stormMark days.since.flow
# 1 1 NA days
# 2 2 3 days
数据:
df <- read.table(text =
"dates station flow stormMark
1 2008-01-01 09512162 20 1
2 2008-01-02 09512162 0 NA
3 2008-01-03 09512162 5 NA
4 2008-01-04 09512162 0 NA
5 2008-01-05 09512162 0 NA
6 2008-01-06 09512162 3.5 2",
stringsAsFactors = FALSE, header = TRUE)
https://stackoverflow.com/questions/50769331
复制相似问题