如何针对特定条件在新向量上建立范围值的总和?

时间:2018-01-22 21:58:34

标签: r loops sum

我怎样才能获得

之后的累计和的新向量
A:
year month day    x   y
               .
               .
               .
2000  10   20     10  0
2000  10   21     2   0
2000  10   22     5   1
2000  10   23     9   0
               .
               .
               .

如果“y”> 0然后,如何将下一个提及向量的这些范围中的“x”值相加:

B:对于y> 0的所有日期,从y> 0和前两天(5 + 2 + 10 = 17)的日期开始的x值之和。

C:对于y> 0的所有日期,在y> 0,即2000-11-10至2000-10-20的事件之前的两天之前10天的x值的总和。在这种情况下,2000-10-22是y> 0,然后将其分组并汇总在事件发生前2天的10天,其中y> 0。

1 个答案:

答案 0 :(得分:0)

要解决您的第一个问题,这是一个想法。我们可以创建一个名为Flag的列,显示符合条件的行。在以下代码中,A2是具有Flag列的中间数据框。 Flag == 1表示行y > 0和前两行。

library(dplyr)
library(tidyr)

A2 <- A %>%
  mutate(Flag1 = ifelse(y > 0, 1, NA)) %>%
  mutate(Flag2 = lead(Flag1, 2)) %>%
  fill(Flag1, .direction = "up") %>%
  fill(Flag2, .direction = "down") %>%
  mutate(Flag = Flag1 + Flag2 - 1) 
A2
#   year month day  x y Flag1 Flag2 Flag
# 1 2000    10  20 10 0     1     1    1
# 2 2000    10  21  2 0     1     1    1
# 3 2000    10  22  5 1     1     1    1
# 4 2000    10  23  9 0    NA     1   NA

之后,我们可以过滤Flag == 1并使用summarise计算总和。 A3是最终输出。

A3 <- A2 %>%
  filter(Flag == 1) %>%
  summarise(x_sum = sum(x))
A3
#   x_sum
# 1    17

关于你的第二个问题,既然你没有提供一个好的示例数据集,至少对我来说,你不清楚你想要什么。我现在不会试着回答这个问题。如果你能提供适当的更新,我可能会考虑一下。

数据

A <- read.table(text = "year month day    x   y
                2000  10   20     10  0
                2000  10   21     2   0
                2000  10   22     5   1
                2000  10   23     9   0",
                header = TRUE, stringsAsFactors = FALSE)