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

Apply cumsum function to a variable with several conditions

我有与此类似的数据:

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 knowledge/googling 技能不再有用了。

我想学习两件事:

  1. 如何给变量赋值一段时间。比方说,我想在 2021-04-01 和 2021-04-05 之间的时间段内为 rad 列中的所有元素赋予值 42。

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

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

最好的, 佐林

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

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

# Specify rows to be modified
modified <- data$date>=as.Date('2021-04-01') & data$date<=as.Date('2021-04-05')
modified.after <- data$date>as.Date('2021-04-06') & data$date<=as.Date('2021-04-15')

# First question
# data$rad[modified] <- 42

# Second question
data$radnew <- data$rad
cs <- cumsum(data$rad[modified])

data$radnew[modified] <- cs
data$radnew[modified.after] <- tail(cs,1) 
data

在回答您的第一个问题时,在 base R 中,您可以在提到的日期期间对 data 进行子集化,并在新变量中为该期间分配值 42,比如 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", 42, NA),
    cmsm = cumsum(date >= "2021-04-01" & date <= "2021-04-05"),
    new2 = ifelse(date >= "2021-04-06" & date <= "2021-04-15", max(cmsm), rad))

结果:

         date rad new1 cmsm new2
1  2021-03-21   2   NA    0    2
2  2021-03-22   7   NA    0    7
3  2021-03-23   8   NA    0    8
4  2021-03-24  10   NA    0   10
5  2021-03-25   3   NA    0    3
6  2021-03-26   9   NA    0    9
7  2021-03-27   8   NA    0    8
8  2021-03-28   7   NA    0    7
9  2021-03-29   8   NA    0    8
10 2021-03-30   5   NA    0    5
11 2021-03-31   1   NA    0    1
12 2021-04-01   8   42    1    8
13 2021-04-02   9   42    2    9
14 2021-04-03   6   42    3    6
15 2021-04-04   9   42    4    9
16 2021-04-05   2   42    5    2
17 2021-04-06   2   NA    5    5
18 2021-04-07   7   NA    5    5
19 2021-04-08   9   NA    5    5
20 2021-04-09   8   NA    5    5
21 2021-04-10   4   NA    5    5
22 2021-04-11   3   NA    5    5
23 2021-04-12   4   NA    5    5
24 2021-04-13   9   NA    5    5
25 2021-04-14   9   NA    5    5
26 2021-04-15   4   NA    5    5
27 2021-04-16   6   NA    5    6
28 2021-04-17   5   NA    5    5
29 2021-04-18   9   NA    5    9
30 2021-04-19   3   NA    5    3
31 2021-04-20   8   NA    5    8
32 2021-04-21   3   NA    5    3