将 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 技能不再有用了。
我想学习两件事:
如何给变量赋值一段时间。比方说,我想在 2021-04-01 和 2021-04-05 之间的时间段内为 rad 列中的所有元素赋予值 42。
更重要的是(与 1. 无关)我想创建一个代码:
- 根据“rad”变量创建一个新列
- 计算“rad”在特定时间段内(例如 2021-04-01 - 2021-04-05)的累计值
- 然后取cumsum的最后一个值(累计求和期间的总和)并赋值给某个时间段(例如2021-04-06 - 2021-04-15)
- 对于未应用函数的其余日期,新变量与“rad”变量具有相同的值
如果您需要更好的解释,请告诉我。我只是不知道如何向您展示所需的输出,因为如果我知道那么我就不会在这里问了。提前谢谢你
最好的,
佐林
您可以使用布尔向量来指定要修改的行:
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
我有与此类似的数据:
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 技能不再有用了。
我想学习两件事:
如何给变量赋值一段时间。比方说,我想在 2021-04-01 和 2021-04-05 之间的时间段内为 rad 列中的所有元素赋予值 42。
更重要的是(与 1. 无关)我想创建一个代码:
- 根据“rad”变量创建一个新列
- 计算“rad”在特定时间段内(例如 2021-04-01 - 2021-04-05)的累计值
- 然后取cumsum的最后一个值(累计求和期间的总和)并赋值给某个时间段(例如2021-04-06 - 2021-04-15)
- 对于未应用函数的其余日期,新变量与“rad”变量具有相同的值
如果您需要更好的解释,请告诉我。我只是不知道如何向您展示所需的输出,因为如果我知道那么我就不会在这里问了。提前谢谢你
最好的, 佐林
您可以使用布尔向量来指定要修改的行:
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