我真诚地希望这个问题以前被问过,如果是这样,我会很高兴被放在现有的线程中。
我的数据基本上包含了几个时间段的信息,这些时间段由各自的开始和结束日期标记。我想转换这些数据,使这些开始日期和结束日期之间的每个日期都是它自己的观察结果,所有数据都与时间框架相关。
到目前为止,我的最佳猜测是对每一行使用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