library(tidyverse)
set.seed(1)
start <- mdy("01/01/2022")
end <- start + as.difftime(99, units = "days")
days <- seq(from = start, to = end, by = 1)
days <- sample(days, 100, replace = T)
expiry <- seq(from = start, to = end + 300, by  = 1)
expiry <- sample(expiry, 100, replace = T)
x <- sample(1:10, 100, replace = T)
df <- tibble(days = days, expiry = expiry, value = x)
df <- df %>% filter(days != expiry) %>% arrange(days)
df$expiry[2] = mdy("01-02-2022") 
df
# A tibble: 100 × 3
   days       expiry     value
   <date>     <date>     <int>
 1 2022-01-01 2022-07-23    10
 2 2022-01-01 2022-01-02     3
 3 2022-01-02 2022-10-27     4
 4 2022-01-06 2022-12-22     2
 5 2022-01-07 2022-03-19     5
 6 2022-01-10 2023-01-08     2
 7 2022-01-13 2022-06-23     8
 8 2022-01-13 2022-05-02     5
 9 2022-01-14 2022-08-02     5
10 2022-01-14 2022-03-06     1
# ℹ 90 more rows
# ℹ Use `print(n = ...)` to see more rows

我要创建的是一个dataframe,它包含一年中每个日期的所有值条目的总和,这些值条目的天数&lt;=date和过期&>;=date.我试了下下面的方法.

days <- seq(from = mdy("01/01/2022"), to = mdy("12-31-2022"), by = 1)
s <- rep(0, length(day))
i = 0

for (d in day){
  for (v in df){
    if (v[1] <= d & v[2] >= d){
      s[i] = s[i] + v[3]
    }
  }
  i <- i + 1
}
tb <- tibble(day, s)
# A tibble: 365 × 2
   day            s
   <date>     <dbl>
 1 2022-01-01     0
 2 2022-01-02     0
 3 2022-01-03     0
 4 2022-01-04     0
 5 2022-01-05     0
 6 2022-01-06     0
 7 2022-01-07     0
 8 2022-01-08     0
 9 2022-01-09     0
10 2022-01-10     0
# ℹ 355 more rows
# ℹ Use `print(n = ...)` to see more rows

这里的结果应该是S的前3个条目是10+3=13,10+3+4=17,10+4=14.自2022-01-03&gt;2022-01-02表中的条目2到期.

基于前10行的预期输出应如下所示:

# A tibble: 10 × 2
   x              y
   <date>     <dbl>
 1 2022-01-01    13
 2 2022-01-02    17
 3 2022-01-03    14
 4 2022-01-04    14
 5 2022-01-05    14
 6 2022-01-06    16
 7 2022-01-07    21
 8 2022-01-08    21
 9 2022-01-09    21
10 2022-01-10    23

从本质上讲,我要做的是模仿EXCEL中的Sumifs函数:

enter image description here

推荐答案

在R中,我们可以用dplyrjoin_by函数来实现这一点.

library(tidyverse)

days <- data.frame(x = days)

by <- join_by(x >= days, x <= expiry)

left_join(days, df, by) %>%
  group_by(x) %>% 
  summarize(value = sum(value, na.rm = TRUE))


# A tibble: 365 × 2
   x          value
   <date>     <int>
 1 2022-01-01    13
 2 2022-01-02    17
 3 2022-01-03    14
 4 2022-01-04    14
 5 2022-01-05    14
 6 2022-01-06    16
 7 2022-01-07    21
 8 2022-01-08    21
 9 2022-01-09    21
10 2022-01-10    23

R相关问答推荐

使用long()在dØr中过滤后获取元素数量

extract()函数不处理stanfit对象,我用错了吗?

将收件箱变量传递给ggplot 2函数

如何使用Cicerone指南了解R Shiny中传单 map 的元素?

在数据表中呈现数学符号

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

R-更新面内部的栅格值

使用Facet_WRAP时更改框图中线的 colored颜色

在R中按行按列范围查找最大值的名称

以相同的方式对每个表进行排序

将向量元素重新排序为R中的第二个

在数据帧列表上绘制GGPUP

使用shiny 中的所选要素行下拉菜单

我是否可以使用多个变异项来构建顺序列(标记多个问题)

如何为混合模型输出绘制不同的线型?

避免在图例中显示VLINS组

如何在AER::ivreg中指定仪器?

在ggplot2图表中通过端点连接点

如果满足条件,则替换列的前一个值和后续值

在不重复主题的情况下重新排列组