r-开始日期和结束日期的数据透视更长



我真诚地希望这个问题以前被问过,如果是这样,我会很高兴被放在现有的线程中。

我的数据基本上包含了几个时间段的信息,这些时间段由各自的开始和结束日期标记。我想转换这些数据,使这些开始日期和结束日期之间的每个日期都是它自己的观察结果,所有数据都与时间框架相关。

到目前为止,我的最佳猜测是对每一行使用for循环,基本上为每个观察创建一个新的data.frame,并将所有观察拼接在一起。但是,我意识到这不可能是一种适度有效的方法,而且由于我正在处理的数据集往往相当大,我希望有一种更具性能的方法。

我希望能找到一条符合tidyverse pivot_langer的路线,因为在我看来,它似乎有着模糊的联系。

原始数据看起来与此示例相似:

data.frame(Location = c("Berlin", "Amsterdam"),
Value = c("A", "B"),
Starting = c("2001-01-01", "2001-01-08"),
Ending = c("2001-01-03", "2001-01-10"))
Location Value   Starting     Ending
1    Berlin     A 2001-01-01 2001-01-03
2 Amsterdam     B 2001-01-08 2001-01-10

理想情况下,所需的输出看起来像这样:

data.frame(Location = rep(c("Berlin", "Amsterdam"), each = 3),
Date = c("2001-01-01", "2001-01-02", "2001-01-03", "2001-01-08", "2001-01-09", "2001-01-10"),
Value = rep(c("A", "B"), each = 3))
Location       Date Value
1    Berlin 2001-01-01     A
2    Berlin 2001-01-02     A
3    Berlin 2001-01-03     A
4 Amsterdam 2001-01-08     B
5 Amsterdam 2001-01-09     B
6 Amsterdam 2001-01-10     B

我们可以在使用seq创建list列后使用unnest

library(dplyr)
library(purrr)
library(tidyr)
df1 %>% 
transmute(Location, Value, Date = map2(as.Date(Starting), 
as.Date(Ending), seq, by = "1 day")) %>%
unnest(Date)

-输出

# A tibble: 6 × 3
Location  Value Date      
<chr>     <chr> <date>    
1 Berlin    A     2001-01-01
2 Berlin    A     2001-01-02
3 Berlin    A     2001-01-03
4 Amsterdam B     2001-01-08
5 Amsterdam B     2001-01-09
6 Amsterdam B     2001-01-10

相关内容

  • 没有找到相关文章

最新更新