r - R - (Tidyverse) 将多个观测值压缩为一个
问题描述
我有一个包含多个变量的数据集,其中两个是日期(开始日期、结束日期)。有时日期间隔已被拆分为序列,例如,您将拥有:
开始:1990-12-12,停止:1990-12-13 开始:1990-12-13,停止:1990-12-14
而不是
开始: 1990-12-12,停止: 1990-12-14
我想要做的是隔离这些序列链并将它们基本上折叠成一个观察结果,以便保存序列末尾的所有观察结果,其余的被覆盖(第一个开始日期除外)。下面是一个基本示例:
library(tidyverse)
library(lubridate)
tib_ex <- tibble(
id = rep(1,5),
date1 = ymd(c('1990-11-05', '1990-12-01',
'1990-12-05', '1990-12-08',
'1990-12-15')),
date2 = ymd(c('1990-11-28', '1990-12-05',
'1990-12-08', '1990-12-12',
'1990-12-31')),
var1 = 2:6,
var2 = 7:11,
var3 = 12:16,
var4 = c(0, 1, 0 ,0, 1)
)
这会产生以下小标题:
# A tibble: 5 x 7
id date1 date2 var1 var2 var3 var4
<dbl> <date> <date> <int> <int> <int> <dbl>
1 1 1990-11-05 1990-11-28 2 7 12 0
2 1 1990-12-01 1990-12-05 3 8 13 1
3 1 1990-12-05 1990-12-08 4 9 14 0
4 1 1990-12-08 1990-12-12 5 10 15 0
5 1 1990-12-15 1990-12-31 6 11 16 1
我想将其转换为以下小标题:
# A tibble: 3 x 7
id date1 date2 var1 var2 var3 var4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1990-11-05 1990-11-28 2 7 12 0
2 1 1990-12-01 1990-12-12 5 10 15 0
3 1 1990-12-15 1990-12-31 6 11 16 1
我考虑过按 id、date1 和 date2 嵌套,它将其余变量打包到每行的一个小标题中,这样很容易覆盖我只是不知道如何有效地将日期从第 2 行折叠到第 4 行。
我已经尝试创建一个二进制变量来跟踪一个观察的结束日期是否与下一个观察的开始日期匹配,但我在那里也遇到了困难。
解决方案
通过与下一行/上一行进行比较来查找具有开始日期和结束日期的行,并以合适的方式组合结果:
date_info <-
tib_ex %>%
## find indices of start and end dates by comparing with date in next / previous row
mutate(is_startdate = date1 != lag(date2),
is_enddate = date2 != lead(date1)) %>%
## NA's appear at the beginning (start_date) and end (end_date) and should thus be interpreted as TRUE
replace_na(list(is_startdate = T, is_enddate = T))
## combine the start- and end-dates
date_info %>%
filter(is_enddate) %>%
mutate(date1 = date_info$date1[date_info$is_startdate]) %>%
select(-starts_with("is_"))
-------
# A tibble: 3 x 7
id date1 date2 var1 var2 var3 var4
<dbl> <date> <date> <int> <int> <int> <dbl>
1 1.00 1990-11-05 1990-11-28 2 7 12 0
2 1.00 1990-12-01 1990-12-12 5 10 15 0
3 1.00 1990-12-15 1990-12-31 6 11 16 1.00
推荐阅读
- python - 自定义嵌入未显示
- javascript - 如何使用php将所有类型的音频文件上传到文件夹
- dart - Dart 流 - skipWhile 不跳过事件
- angular - 为什么我的代码的一部分没有运行,即使它在一个函数中并且它上面的打印语句有效?
- python - 带有指针的python中的for循环
- object - 对重新分配的静态对象引用进行 GC
- java - 如何使用两个按钮而不是 JOptionPane.showOptionDialog?
- python - 根据条件连接数据集
- excel - 在 VBA 中更改单元格验证列表源
- python - 将 pytorch 2d 填充转换为 tensorflow keras