r - 如何在 R 中创建一列,根据前一行的值计算一行的值?
问题描述
这是我想在 Excel 中实现的功能,但我似乎无法在 R 中找到解决方案。
这是我试图做的,但它似乎不允许我使用我正在尝试制作的新列的先前值进行操作。
这是一个可重现的示例:
library(dplyr)
set.seed(42) ## for sake of reproducibility
dat <- data.frame(date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"))
这将是数据框的输出:
dat
date
1 2020-12-26
2 2020-12-27
3 2020-12-28
4 2020-12-29
5 2020-12-30
6 2020-12-31
期望的输出:
date periodNumber
1 2020-12-26 1
2 2020-12-27 2
3 2020-12-28 3
4 2020-12-29 4
5 2020-12-30 5
6 2020-12-31 6
我的尝试:
dat %>%
mutate(periodLag = dplyr::lag(date)) %>%
mutate(periodNumber = ifelse(is.na(periodLag)==TRUE, 1,
ifelse(date == periodLag, dplyr::lag(periodNumber), (dplyr::lag(periodNumber) + 1))))
Excel公式截图:
解决方案
你可以使用dplyr
's cur_group_id()
:
library(dplyr)
set.seed(42)
# I used a larger example
dat <- data.frame(date=sample(seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"), size = 30, replace = TRUE))
dat %>%
arrange(date) %>% # needs sorting because of the random example
group_by(date) %>%
mutate(periodNumber = cur_group_id())
这返回
# A tibble: 30 x 2
# Groups: date [6]
date periodNumber
<date> <int>
1 2020-12-26 1
2 2020-12-26 1
3 2020-12-26 1
4 2020-12-26 1
5 2020-12-26 1
6 2020-12-26 1
7 2020-12-26 1
8 2020-12-26 1
9 2020-12-27 2
10 2020-12-27 2
11 2020-12-27 2
12 2020-12-27 2
13 2020-12-27 2
14 2020-12-27 2
15 2020-12-27 2
16 2020-12-28 3
17 2020-12-28 3
18 2020-12-28 3
19 2020-12-29 4
20 2020-12-29 4
21 2020-12-29 4
22 2020-12-29 4
23 2020-12-29 4
24 2020-12-29 4
25 2020-12-30 5
26 2020-12-30 5
27 2020-12-30 5
28 2020-12-30 5
29 2020-12-30 5
30 2020-12-31 6
推荐阅读
- amazon-web-services - 与数据传输相关的 AWS 账单问题
- vue.js - 单击vuetify中的按钮时如何显示日期选择器?
- javascript - 模态组件使用
- python - 确认这种使用神经网络处理缺失值的方法
- ruby-on-rails - Rails_admin 一键删除几个项目
- javascript - 如果语句函数根据元素值隐藏表单输入,如何使其更短?
- sql - SQL INNER JOIN 返回外键值而不是主键值
- oracle-sqldeveloper - 如何使用脚本(最好使用 SQLDeveloper)将表导出到 Excel 文件?
- python-3.x - 如何更改 Tkinter 中的图片?
- javascript - 如何使用 d3 将 json 渲染为网络图