r - 使用 dplyr 和 tidyr 计算分组变量的有序行之间的距离(时间)
问题描述
我想将时差分配给每个组中的最后一个条目。
这是我的玩具数据集(dfx):
vals<- 1:5
grps <- c(1,1,2,2,2)
dts <- as.Date(c("2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-05"))
dfx <- as_tibble(cbind(vals,grps,dts))
colnames(dfx) <- c("vals","grps","dts")
(dfx <- dfx %>% mutate(dts = as.Date(dts)))
dfx 是一个 5 x 3 的小标题:
vals grps dts
<dbl> <dbl> <date>
1 1 1 2020-01-01
2 2 1 2020-01-02
3 3 2 2020-01-03
4 4 2 2020-01-04
5 5 2 2020-01-05
grps
是一个分组变量;这里它包含 2 个组 (1,2)。我想要的输出将是每组最后一天的距离(以天为单位),并且应该看起来像rslt
(我的玩具结果):
bfr <-as.tibble(c(1,0,2,1,0))
colnames(bfr) <- "dist"
(rslt <- bind_cols(dfx,bfr))
vals grps dts dist
<dbl> <dbl> <date> <dbl>
1 1 1 2020-01-01 1
2 2 1 2020-01-02 0
3 3 2 2020-01-03 2
4 4 2 2020-01-04 1
5 5 2 2020-01-05 0
如果可能的话,我想使用dplyr
,lubridate
和tidyr
来完成这项工作。
解决方案
确保您的日期按顺序排列。使用group_by
to group by grps
,然后取 thelast(dts)
和每一行的差值。
library(tidyverse)
dfx %>%
mutate(dts = as.Date(dts, origin = "1970-01-01")) %>%
arrange(dts) %>%
group_by(grps) %>%
mutate(dist = as.numeric(last(dts) - dts))
输出
# A tibble: 5 x 4
# Groups: grps [2]
vals grps dts dist
<dbl> <dbl> <date> <dbl>
1 1 1 2020-01-01 1
2 2 1 2020-01-02 0
3 3 2 2020-01-03 2
4 4 2 2020-01-04 1
5 5 2 2020-01-05 0
推荐阅读
- capybara - Capybara ingore 在指定断言的“范围内”
- javascript - WDIO - 本地和远程机器中的 isDisplayed() 方法差异
- android - 应用程序未部署在 Google Play 控制台中
- angular - Angular 10 Fullcalendar - 如何编辑事件标题、内容以及如何删除事件?
- python - 使用 Python SDK 创建 Azure 容器时出现“HTTP 标头格式不正确”错误
- google-sheets - 如何通过在谷歌表格/excel中使用每天的开始时间和小时数来找到完成时间?
- javascript - 将导航 html 代码移动到单独的文件,javascript 现在不起作用
- meson-build - Meson:如何运行依赖于外部进程的测试?
- wpf - 拖放:按下 CTRL 时如何显示“移动”光标?
- arrays - 在 Bash 中,如果我只有它的名称,我如何测试数组是否已声明