问题描述
我有类似的数据:
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 知识/谷歌搜索技能不再有用。
我想了解两件事:
- 基于“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))