【问题标题】:How to make the sum of a range values on a new vector for specific conditions?如何在特定条件下对新向量的范围值求和?
【发布时间】:2018-01-23 06:42:44
【问题描述】:

我怎样才能获得以下累积和的新向量

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 的日期和前两天 (5+2+10=17) 的 x 值的总和,对于所有 y>0 的日期。

C:y>0 的事件前两天前 10 天的 x 值的总和,即从 2000-11-10 到 2000-10-20,对于所有 y>0 的日期。本例中2000-10-22为y>0,则对y>0的事件前2天前10天进行分组汇总。

【问题讨论】:

    标签: r loops sum


    【解决方案1】:

    为了解决您的第一个问题,这里有一个想法。我们可以创建一个名为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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多