【问题标题】:Create new column based on cut off date (date from another column)根据截止日期创建新列(来自另一列的日期)
【发布时间】:2021-10-21 18:53:10
【问题描述】:

我在下面有一个示例 df(日期格式为 as.Date):

| date       |
--------------
| 2020-03-03 |
| 2020-06-30 |
| 2020-01-23 |
| 2020-02-10 |
| 2020-11-29 |

我正在尝试根据截止日期 2020-05-01 添加一列,并希望获得此表:


| date       | cutoff |
------------------------
| 2020-03-03 | prior   |
| 2020-06-30 | later   |
| 2020-01-23 | prior   |
| 2020-02-10 | prior   |
| 2020-11-29 | later   |

我使用 dplyr 并调用了 mutate 来创建一个列,并最初应用了 case_when:

df %>%
  mutate(cutoff = case_when(
    date < 2020-05-01 ~ "prior",
    "later"
  ))

上面的代码创建了只有“后来”值的截止列。

我也试过 ifelse:

df <- with(df, ifelse(date < 2020-05-01, "prior", "later"))

上面的代码将日期列中的值替换为 NA 值。

我尝试了不同的代码:

df %>%
  mutate(cutoff = case_when(date < 2020-05-01 ~ "prior", 
                          TRUE ~ "later"))

但结果与我尝试的第一个代码相同。

我想将日期转换为 POSixct 格式,但上面的每个代码都产生了与上面相同的输出。

【问题讨论】:

  • 您尝试将2020-05-01 包裹在as.Date() 中吗?
  • 我刚试过,但日期已经在正确的日期,但它仍在询问原始值。在这种情况下,我应该用什么来补充原始日期?
  • 您能否使用dput(df) 将您的示例数据框发布到您的问题中?
  • 我不确定我是否做得对:Df
  • 日期应包含在" 中。 dput() 返回一个可以轻松导入的结构,并显示数据的真实结构。在此基础上,可以创建可能的解决方案。如果可能,您应该显示您正在使用的部分数据(如前所述,您确实在实际数据上尝试了一些代码)。 dput(YourDataFrame)dput(head(YourData)) 应该给出预期的结构输出。

标签: r date dplyr case


【解决方案1】:

首先使用ymd 定义日期类,然后使用ifelse

library(lubridate)
library(dplyr)
df %>% 
  mutate(date = ymd(date),
         cutoff = ifelse(date < ymd("2020-05-01"), "prior", "later")) 
        date cutoff
1 2020-03-03  prior
2 2020-06-30  later
3 2020-01-23  prior
4 2020-02-10  prior
5 2020-11-29  later

数据:

df <- structure(list(date = c("2020-03-03", "2020-06-30", "2020-01-23", 
"2020-02-10", "2020-11-29")), class = "data.frame", row.names = c(NA, 
-5L))

【讨论】:

  • 我可能遗漏了一些东西。我遵循了您的格式,但它仅将所有日期标记为“之前”。让我稍后再试一次。我的眼睛可能已经因为看屏幕几个小时而感到疲倦了。我稍后会更新你。谢谢
  • 检查数据中的日期类别,如果是上课日期,那么您不需要像我一样将其转换为上课日期。用我上传的数据检查代码。
  • 成功了。我在我的实际 df 中监督了我的一年。谢谢
猜你喜欢
  • 2020-11-24
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2020-02-23
相关资源
最近更新 更多