【问题标题】:Populate rows based on the date sequence in R根据 R 中的日期序列填充行
【发布时间】:2020-06-14 08:43:50
【问题描述】:

我有一个数据框,每行都有一个特定的日期范围。

  stuID stdID  roleStart    roleEnd
1     1      7 2010-11-18 2020-06-14
2     2      2 2012-08-13 2014-04-01
3     2      4 2014-04-01 2015-10-01
4     2      3 2015-10-01 2018-10-01
5     2      6 2018-10-01 2020-06-14
6     3      4 2014-03-03 2015-10-01

我需要根据日期的周数生成行。准确地说,我需要根据给定数据框中两个日期之间的周数填充行。

我尝试使用以下代码实现此目的

extendedData <- reshape2::melt(setNames(lapply(1:nrow(df), function(x) seq.Date(df[x, "roleStart"],
                                                                      df[x, "roleEnd"], by = "1 week")),df$stuID))

但是当我执行此操作时,我收到了错误消息

Error in seq.int(0, to0 - from, by) : wrong sign in 'by' argument

这是数据框的结构

'data.frame':   350 obs. of  4 variables:
 $ stuID    : int  1 2 2 2 2 3 3 3 4 4 ...
 $ stdID   :  int  7 2 4 3 6 4 3 6 1 2 ...
 $ roleStart: Date, format: "2010-11-18" "2012-08-13" "2014-04-01" "2015-10-01" ...
 $ roleEnd  : Date, format: "2020-06-14" "2014-04-01" "2015-10-01" "2018-10-01" ...

谁能说出代码有什么问题?

提前致谢!!

【问题讨论】:

  • 该错误可能表明您的结束日期发生在开始日期之后,可能是由于输入错误。试试seq(as.Date("2020-06-14"), as.Date("2020-06-01"), by = "1 week")。除此之外,代码似乎工作。相关的,可能重复的Expand ranges defined by “from” and “to” columns

标签: r date reshape seq


【解决方案1】:

这是一种使用tidyverse 函数的方法:

library(dplyr)

df %>%
  mutate(date = purrr::map2(roleStart, roleEnd, seq, by = 'week')) %>%
  tidyr::unnest(date)

就您的代码而言,在这一步之前它可以正常工作,即生成每周日期

lapply(1:nrow(df), function(x) 
      seq.Date(df[x, "roleStart"], df[x, "roleEnd"], by = "1 week"))

我不确定您要对那里的 setNamesmelt 函数做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2018-03-02
    相关资源
    最近更新 更多