我有一个数据框,看起来像:

  start_date   end_date name value
1 2020-01-01 2020-01-06    x     2
2 2020-01-05 2020-01-07    y     4

我想按天排列日期,这样name个变量就变成了各自value的列,如下所示:

        date  x  y
1 2020-01-01  2 NA
2 2020-01-02  2 NA
3 2020-01-03  2 NA
4 2020-01-04  2 NA
5 2020-01-05  2  4
6 2020-01-06  2  4
7 2020-01-07 NA  4

我对base R解决方案感兴趣,但也对使用dplyr和/或lubridate的解决方案感兴趣

推荐答案

将"\u date"列转换为Date类(如果它不在Date类中),然后使用map2(或在rowwise之后也可以执行)获取"start\u date"、"end\u date"之间的sequnnest list列,并使用pivot_wider将其reshape 为"wide"格式,从而创建"date"列

library(dplyr)
library(lubridate)
library(purrr)
library(tidyr)
df1 %>% 
  mutate(across(ends_with('_date'), ymd)) %>% 
  transmute(date = map2(start_date, end_date, seq, by = "1 day"), 
       name, value) %>% 
  unnest(date) %>%
  pivot_wider(names_from = name, values_from = value)

-输出

# A tibble: 7 × 3
  date           x     y
  <date>     <int> <int>
1 2020-01-01     2    NA
2 2020-01-02     2    NA
3 2020-01-03     2    NA
4 2020-01-04     2    NA
5 2020-01-05     2     4
6 2020-01-06     2     4
7 2020-01-07    NA     4

正如OP提到的base R种方法一样,一个选项是使用Map在"\u date"列之间创建序列,即创建数据.帧在listmerge之间,帧为Reduce

Reduce(function(...) merge(..., all = TRUE),
   do.call(Map, c(f = function(u, v, nm, val) {
    dat <- 数据.frame(date = seq(as.Date(u), as.Date(v), 
   by = "1 day"),  val)
  names(dat)[2] <- nm; dat
   }, unname(df1))))

-输出

        date  x  y
1 2020-01-01  2 NA
2 2020-01-02  2 NA
3 2020-01-03  2 NA
4 2020-01-04  2 NA
5 2020-01-05  2  4
6 2020-01-06  2  4
7 2020-01-07 NA  4

数据

df1 <- structure(list(start_date = c("2020-01-01", "2020-01-05"), 
end_date = c("2020-01-06", 
"2020-01-07"), name = c("x", "y"), value = c(2L, 4L)), 
class = "数据.frame", row.names = c("1", 
"2"))

R相关问答推荐

为什么我的基准测试会随着样本量的增加而出现一些波动?

将文件保存到新文件夹时,切换r设置以不必创建目录

在R中按行按列范围查找最大值的名称

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

2个Rscript.exe可执行文件有什么区别?

如何删除最后一个可操作对象

在不丢失空值的情况下取消列出嵌套列表

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

将向量元素重新排序为R中的第二个

按组计算列中1出现的间隔年数

远离理论值的伽马密度曲线下面积的近似

如何使用字符串从重复的模式中提取多个数字?

创建新列,其中S列的值取决于该行S值是否与其他行冗余

数据集上的R循环和存储模型系数

构建一个6/49彩票模拟系统

conditionPanel不考虑以下条件

如何在R中的两列以上使用联合(&U)?

从data.table列表中提取特定组值,并在R中作为向量返回

具有某些列的唯一值的数据帧

从不同长度的列中随机排序特定数量的元素