我有一个看起来像这样的数据框:
Issuer.Name Issue.Date
name1 01/12/2021
name2 05/04/2022
name2 21/10/2021
name3 08/09/2020
name4 30/08/2023
name4 12/05/2021
name4 18/10/2022
name5 01/12/2021
我想创建一个新的因子变量“Y/N”,由 Issuer.Name 检查这是否是组 Issuer.Name 的第一个 Issue.Date。它应该返回类似的内容:
Issuer.Name Issue.Date First.Issue.Date
name1 01/12/2021 Y
name2 05/04/2022 N
name2 21/10/2021 Y
name3 08/09/2020 Y
name4 30/08/2023 N
name4 12/05/2021 Y
name4 18/10/2022 N
name5 01/12/2021 Y
我使用了这个命令,它工作得很好,但我认为肯定可以做一些更简洁的事情
df <- df %>%
group_by(Issuer.Name) %>%
arrange(Issue.Date) %>%
mutate(First.Issue.Date = Issue.Date[1]) %>%
mutate(First.Issue=case_when(Issue.Date==First.Issue.Date~"Y",.default = "N"))
问题是您不是在寻找“第一个”日期,而是在寻找“最早的日期”。如果您的数据已排序,这些将是相同的事情,但事实并非如此,所以它们不是。
dplyr::mutate(df, f = Issue.Date == min(Issue.Date), .by = Issuer.Name)
dplyr::mutate(df, `Y/N` = ifelse(Issue.Date == min(Issue.Date), "Y","N"), .by = Issuer.Name)
备注:
一般来说,包括 true 和 false,因为除了 TRUE 或 FALSE 之外的任何内容都是不受欢迎的,因为它占用更多空间,处理起来更麻烦,并且可能导致奇怪的错误(例如,如果你忘记了)稍后,开始使用小写的“y”和“n”,或者“yes”和“no”,那么什么都不会匹配)。
此外,在变量名称中使用斜杠,虽然你
可以使用
group_by()
ungroup()
(或者更好的是,像我一样使用
.by
,因为这样可以省去记住这样做的麻烦)。在过去的几个月里,我个人见过至少有六个人提出问题,最终他们忘记了 ungroup()
,然后对为什么他们的代码没有给出正确的结果感到困惑。
数据:
df <- data.frame(
Issuer.Name = c("name1", "name2", "name2", "name3", "name4", "name4", "name4", "name5"),
Issue.Date = as.Date(c("01/12/2021", "05/04/2022", "21/10/2021", "08/09/2020", "30/08/2023", "12/05/2021", "18/10/2022", "01/12/2021"), format="%d/%m/%Y"))