- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:
我有一个数据框,其中包含跨案例(列: begin
)的持续时间(列: end
和 case
)。一些持续时间跨越两年。我需要将这些案例分为年度持续时间:一个持续到年底,剩余的持续时间从明年开始。
目前的做法:
我设法计算了这些持续时间(请参阅下面的当前方法),但我无法将相应的行拆分为多个行,同时不影响年度案例。
您可以在下面找到一个可重现的示例:
# Packages
library(tidyverse)
library(lubridate)
# Reproducible example
df <- tibble(
case = c(1, 1, 2, 3),
begin = ymd("2019-12-20", "2019-08-05", "2012-01-01", "2014-10-10"),
end = ymd("2020-01-15", "2019-08-20", "2012-01-12", "2015-01-15"),
reason = c("X", "Y", "X", "Y"))
head(df)
#> # A tibble: 4 x 4
#> case begin end reason
#> <dbl> <date> <date> <chr>
#> 1 1 2019-12-20 2020-01-15 X
#> 2 1 2019-08-05 2019-08-20 Y
#> 3 2 2012-01-01 2012-01-12 X
#> 4 3 2014-10-10 2015-01-15 Y
# Goal (split durations and make them "longer")
goal <- tibble(
case = c(1, 1, 1, 2, 3, 3),
begin = ymd("2019-12-20", "2020-01-01", "2019-08-05", "2012-01-01", "2014-10-10", "2015-01-01"),
end = ymd("2019-12-31", "2020-01-15", "2019-08-20", "2012-01-12", "2014-12-31", "2015-01-15"),
reason = c("X", "X", "Y", "X", "Y", "Y"))
head(goal)
#> # A tibble: 6 x 4
#> case begin end reason
#> <dbl> <date> <date> <chr>
#> 1 1 2019-12-20 2019-12-31 X
#> 2 1 2020-01-01 2020-01-15 X
#> 3 1 2019-08-05 2019-08-20 Y
#> 4 2 2012-01-01 2012-01-12 X
#> 5 3 2014-10-10 2014-12-31 Y
#> 6 3 2015-01-01 2015-01-15 Y
# Current approach
df %>%
mutate(end_year = if_else(year(begin) != year(end),
ceiling_date(ymd(begin), "year") - days(1), end),
begin_year = if_else(year(begin) != year(end),
ceiling_date(ymd(end), "year"), begin))
#> # A tibble: 4 x 6
#> case begin end reason end_year begin_year
#> <dbl> <date> <date> <chr> <date> <date>
#> 1 1 2019-12-20 2020-01-15 X 2019-12-31 2021-01-01
#> 2 1 2019-08-05 2019-08-20 Y 2019-08-20 2019-08-05
#> 3 2 2012-01-01 2012-01-12 X 2012-01-12 2012-01-01
#> 4 3 2014-10-10 2015-01-15 Y 2014-12-31 2016-01-01
# Final solution
library(tidyverse)
library(lubridate)
# Reproducible example
df <- tibble(
case = c(1, 1, 2, 3),
begin = ymd("2019-12-20", "2019-08-05", "2012-01-01", "2014-10-10"),
end = ymd("2020-01-15", "2019-08-20", "2012-01-12", "2015-01-15"),
reason = c("X", "Y", "X", "Y"))
# Find durations that run across a year
df2 <- df %>%
filter(year(end) != year(begin)) %>%
mutate(begin = ceiling_date(ymd(begin), "year"), begin)
#
df <- df %>%
mutate(end = if_else(year(end) != year(begin),
ceiling_date(ymd(begin), "year") - days(1), end))
# Merge
df <- df %>%
bind_rows(df2) %>%
arrange(case, reason)
head(df)
#> # A tibble: 6 x 4
#> case begin end reason
#> <dbl> <date> <date> <chr>
#> 1 1 2019-12-20 2019-12-31 X
#> 2 1 2020-01-01 2020-01-15 X
#> 3 1 2019-08-05 2019-08-20 Y
#> 4 2 2012-01-01 2012-01-12 X
#> 5 3 2014-10-10 2014-12-31 Y
#> 6 3 2015-01-01 2015-01-15 Y
最佳答案
您不能使用 mutate
使您的数据更长。
通过复制连接一年的条目,然后使用 lubridate 函数根据需要控制月份和日期,然后将重复项连接回原始数据框,可以最简单地展示如何在基本 R 语法中完成此操作。
bridgers <- which(year(df$end) != year(df$begin))
df2 <- df[bridgers,]
year(df$end[bridgers]) <- year(df$begin[bridgers])
month(df$end[bridgers]) <- 12
mday(df$end[bridgers]) <- 31
year(df2$begin) <- year(df2$end)
month(df2$begin) <- 1
mday(df2$begin) <- 1
df <- rbind(df, df2)
df[order(df$case), ]
#> # A tibble: 6 x 4
#> case begin end reason
#> <dbl> <date> <date> <chr>
#> 1 1 2019-12-20 2019-12-31 X
#> 2 1 2019-08-05 2019-08-20 Y
#> 3 1 2020-01-01 2020-01-15 X
#> 4 2 2012-01-01 2012-01-12 X
#> 5 3 2014-10-10 2014-12-31 Y
#> 6 3 2015-01-01 2015-01-15 Y
关于r - 将持续时间拆分为年度部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60828291/
在表单数据提交到 MySQL 数据库之前,我使用 PHP 来验证表单输入。 仅验证年度表单输入的最佳方法是什么?我有一个表单输入,用户应该在其中输入一个日期,仅以一年的形式输入。显然我可以检查输入的数
是否可以创建一个 sql 语句来动态生成 3 行而无需任何表..这些将包括 value1 : 10 | value2: 10 value2 : 11 | value2: 11 value3 : 12
我有以下 SQL 数据库:表名 date fname surname points display 2015-08-08 John Lennon 5
我们的 iOS 应用程序仅通过 https 进行调用,而没有其他任何方式,因此我们必须提交我们的 self 分类报告。我们填写了每个字段,但我们不知道 ECCN 是 5D002 还是 5D992 还是
我们将从以下数据表开始: id date 1: 1 2015-12-31 2: 1 2014-12-31 3: 1 2013-12-31 4: 1 2012-12-
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我在 PHP 的文档中看到有两种方法可以将年份值格式化为 4 位数字: Y - A full numeric representation of a year, 4 digits o - ISO-86
我是一名优秀的程序员,十分优秀!