如何编写一个循环,将指定数量的行添加到此数据框?
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")
)
您解读如下:
- 每个项目都有一个开始日 (Week_Start_Day) — 工作开始的那一天
- 每个项目都有一个以周为单位的持续时间
- 每个项目每周需要 x 小时(Weekly_Hours)
- 每个项目都有一个名称(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
下面有这个数据框。
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")
)
您解读如下:
- 每个项目都有一个开始日 (Week_Start_Day) — 工作开始的那一天
- 每个项目都有一个以周为单位的持续时间
- 每个项目每周需要 x 小时(Weekly_Hours)
- 每个项目都有一个名称(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