R找出一个组的最早日期,并创建一个因子变量Y/N来指示它是否是该组的第一个日期

ryoqjall  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(110)

我有一个这样的框架:

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"))
bgtovc5b

bgtovc5b1#

问题是你不是在寻找 * 第一个 * 日期,你在寻找 * 最早的日期 *。如果你的数据是排序过的,这些都是一样的,但它不是,所以它们不是。

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)

备注:
1.一般来说,包括true和false作为除了TRUE或TRUE之外的任何东西都是不受欢迎的,因为它占用了更多的空间,并且处理起来更痛苦,并且可能导致奇怪的错误(例如,如果你后来忘记了,开始使用“y”和“n”,或者“yes”和“no”,那么什么都不匹配)。
1.此外,在变量名中使用斜杠,虽然你可以这样做,但它可能会导致bug,因为没有反引号,R将Y/N解释为变量Y除以变量N,这是不好的。
1.当使用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"))

相关问题