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

问题描述 投票:0回答:1

我有一个看起来像这样的数据框:

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"))
r dataframe date case mutate
1个回答
0
投票

问题是您不是在寻找“第一个”日期,而是在寻找“最早的日期”。如果您的数据已排序,这些将是相同的事情,但事实并非如此,所以它们不是。 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”,那么什么都不会匹配)。

  1. 此外,在变量名称中使用斜杠,虽然你

    可以
  2. 这样做,但可能会导致错误,因为如果没有反引号,R 会将 Y/N 解释为变量 Y 除以变量 N,这
  3. 使用

    group_by()
  4. 时,最好在最后使用
  5. 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"))
    

© www.soinside.com 2019 - 2024. All rights reserved.