将 cumsum 函数应用于具有多个条件的变量

问题描述

我有类似的数据:

data <- data.frame (date=seq.Date(as.Date("2021-03-21"),as.Date("2021-04-21"),"day"),rad= sample(1:10,32,replace = T))

> head(data)
        date rad
1 2021-03-21   1
2 2021-03-22   5
3 2021-03-23   1
4 2021-03-24   9
5 2021-03-25  10
6 2021-03-26   4
...

我目前正在学习扭曲和操作大型数据集,并偶然发现了一个案例,我的 R 知识/谷歌搜索技能不再有用。

我想了解两件事:

  1. 如何为某个时期的变量赋值。例如,假设我想为 rad 列中的所有元素在 2021-04-01 和 2021-04-05 之间的时间段内赋予 42 的值。

  2. 更重要的是(与 1 无关。)我想创建一个代码

  • 基于“rad”变量创建一个新列
  • 计算特定时间段内“rad”的总和(例如 2021-04-01 - 2021-04-05)
  • 然后取 cumsum 的最后一个值(累计求和期的总和)并将其分配给某个时间段(例如 2021-04-06 - 2021-04-15)
  • 对于未应用任何函数的其余日期,新变量与“rad”变量具有相同的值

如果您需要更好的解释,请告诉我。我只是不知道如何向您展示所需的输出,因为如果我知道那么我就不会在这里问了。提前致谢

最好的, 佐林

解决方法

您可以使用布尔向量来指定要修改的行:

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.0.11/vue.global.js" integrity="sha512-1gHWIGJfX0pBsPJHfyoAV4NiZ0wjjE1regXVSwglTejjna0/x/XG8tg+i3ZAsDtuci24LLxW8azhp1+VYE5daw==" crossorigin="anonymous"></script>
<div id="app">
  <button 
    v-for="(but,i) in btnArray" 
    :key="i" 
    @click="but.action(but.text)"
    :ref="but.ref"
   >  
    {{ but.text }}
   </button>
</div>
,

回答您的第一个问题,在 base R 中,您可以在提到的日期期间对 data 进行子集化,并在新变量中为该期间分配值 42,例如 {{1 }}:

x

您可以使用 data$rad[data$date >= "2021-04-01" & data$date <= "2021-04-05"] <- 42 实现相同的目的:

dplyr

编辑

关于您的第二个问题(如果我理解正确的话)您可能最好以这种方式使用 library(dplyr) data %>% mutate(rad = ifelse(date >= "2021-04-01" & date <= "2021-04-05",42,NA))

dplyr

结果:

data %>%
  mutate(
    new1 = ifelse(date >= "2021-04-01" & date <= "2021-04-05",NA),cmsm = cumsum(date >= "2021-04-01" & date <= "2021-04-05"),new2 = ifelse(date >= "2021-04-06" & date <= "2021-04-15",max(cmsm),rad))