如何编写一个循环,将指定数量的行添加到此数据框?

How can I write a loop that adds a specified number of rows to this data frame?

下面有这个数据框。

 my_tibble <- tibble(
  Week_Start_Day = mdy(c("06-06-2022","06-20-2022","07-04-2022")),
  Duration = c(8,1,3),
  Weekly_Hours = c(10,5.5,15.667),
  Project = c("ClientA","ClientB","ClientC")
)

您解读如下:

  1. 每个项目都有一个开始日 (Week_Start_Day) — 工作开始的那一天
  2. 每个项目都有一个以周为单位的持续时间
  3. 每个项目每周需要 x 小时(Weekly_Hours)
  4. 每个项目都有一个名称(Project_Name)

我想为项目的每一周创建一个单独的行,以便我可以在每周视图中可视化它。例如,第 1 行的 Duration 为 8,表示项目持续 8 周。因此,它应该被复制 7 次。每个重复的行都应该有一个新的 Week_Start_Day,它应该比之前的多 7。因此,对于 ClientA,我们应该在 6/6、6/13、6/20、6/27 等总共有 8 行。所有其他数据需要保持不变。

我试了很多循环,都失败了。我尝试手动添加一行只是为了看看我是否会得到一些灵感,但我无法将其转换为循环。下面是添加新行的一个例子:

my_tibble[4,]$Week_Start_Day <- my_tibble[1,]$Week_Start_Day + 7
my_tibble[4,]$Duration <- my_tibble[1,]$Duration
my_tibble[4,]$Weekly_Hours <- my_tibble[1,]$Weekly_Hours
my_tibble[4,]$Project <- my_tibble[1,]$Project

我想我可以使用一个 while 循环和一个每次递减的列 Weeks_Remaining。所以像这样的伪代码:

当剩余周数 > 1 时,添加一行 Week_Start_Day + 7 并将剩余周数减 1。

我使用下面的代码将行复制了正确的次数,但是如您所见,周日期字段没有递增。

my_tibble_1 <- data.frame(lapply(my_tibble, rep, my_tibble$Duration))  

这可能会让您更接近您要寻找的内容:

tibble(
  Week_Start_Day = mdy(c("06-06-2022","06-20-2022","07-04-2022")),
  Duration = c(8,1,3),
  Weekly_Hours = c(10,5.5,15.667),
  Project = c("ClientA","ClientB","ClientC")
) %>% 
  mutate(
    weeks = map2(Week_Start_Day, Duration, ~ .x + weeks(1:.y-1))
  ) %>% 
  unnest(c(weeks))

这将生成一个新列 weeks,其中包含定义持续时间内每周的开始日期。

这里不需要循环:

 my_tibble %>% 
   group_by_all() %>% 
   summarize(Week_beginning = Week_Start_Day + 7 * (seq(Duration) - 1)) 
#>    Week_Start_Day Duration Weekly_Hours Project Week_beginning
#>    <date>            <dbl>        <dbl> <chr>   <date>        
#>  1 2022-06-06            8         10   ClientA 2022-06-06    
#>  2 2022-06-06            8         10   ClientA 2022-06-13    
#>  3 2022-06-06            8         10   ClientA 2022-06-20    
#>  4 2022-06-06            8         10   ClientA 2022-06-27    
#>  5 2022-06-06            8         10   ClientA 2022-07-04    
#>  6 2022-06-06            8         10   ClientA 2022-07-11    
#>  7 2022-06-06            8         10   ClientA 2022-07-18    
#>  8 2022-06-06            8         10   ClientA 2022-07-25    
#>  9 2022-06-20            1          5.5 ClientB 2022-06-20    
#> 10 2022-07-04            3         15.7 ClientC 2022-07-04    
#> 11 2022-07-04            3         15.7 ClientC 2022-07-11    
#> 12 2022-07-04            3         15.7 ClientC 2022-07-18