【问题标题】:How to look up date value from same table based on a condition in R?如何根据 R 中的条件从同一个表中查找日期值?
【发布时间】:2021-12-25 08:45:20
【问题描述】:

我不确定这个任务是否属于self join。我基本上试图在下面的数据框中查找每个State.UnionTerritory最新日期,其中每个Daily_confirmed 案例是当前日期的一半。

这将帮助我获得每个州在每个日期的病例翻倍时间。

library(tidyverse)
library(lubridate)

df_ind <- read_csv("https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/sample_data.csv")

df_ind %>% head()

# output
Date       State.UnionTerritory Daily_confirmed
  <date>     <chr>                          <dbl>
1 2021-12-23 Haryana                           46
2 2021-12-23 Maharashtra                     1179
3 2021-12-23 Delhi                            118
4 2021-12-22 Haryana                           55
5 2021-12-22 Maharashtra                     1201
6 2021-12-22 Delhi                            125

例如,Delhi2021-12-23 上有118 的案例,而德里的这一比例不到或一半是572021-12-15 上,所以翻倍率将是2021-12-23 - 2021-12-15 = 8天。

所以我应该得到类似的东西:

这应该适用于数据中的每个州以及所有日期。

df_ind <- df_ind %>%
  mutate(Daily_confirmed_half = as.integer(Daily_confirmed / 2) )

我不确定我如何准确地尝试这个来获得正确的日期作为Doubling_Date 列,其中Daily_confirmed 案例值满足&lt;= half 的条件。

我可以group summarize 和使用first 提取最新日期,但不确定将正确日期带入此数据框的另一列的有效方法。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我不确定这是否是您想要的输出。该方法使用full_joinfilter 来模拟dplyr 中的非euqal 连接。然后我们进行一些数据清理,在最后一步中,我们需要对原始数据使用left_join,因为有好几天我们无法计算加倍日期,因为它不包含在时间序列中。

    library(tidyverse)
    library(lubridate)
    
    df_ind %>% 
      group_by(State.UnionTerritory) %>% 
      full_join(., ., by = c("State.UnionTerritory")) %>%
      filter(Date.x > Date.y,
             Daily_confirmed.x > (Daily_confirmed.y * 2)) %>% 
      group_by(Date.x, State.UnionTerritory) %>% 
      filter(Date.y == max(Date.y)) %>% 
      filter(Daily_confirmed.y == max(Daily_confirmed.y)) %>% 
      rename("Date" = Date.x,
             "Daily_confirmed" = Daily_confirmed.x,
             "Doubling_Date" = Date.y) %>% 
      select(- Daily_confirmed.y) %>% 
      mutate(Day_to_double = Date - Doubling_Date) %>% 
      left_join(df_ind,
                .,
                by = c("Date", "State.UnionTerritory", "Daily_confirmed")) %>% 
      arrange(State.UnionTerritory, desc(Date)) 
    
    #> # A tibble: 252 x 5
    #>    Date       State.UnionTerritory Daily_confirmed Doubling_Date Day_to_double
    #>    <date>     <chr>                          <dbl> <date>        <drtn>       
    #>  1 2021-12-23 Delhi                            118 2021-12-15     8 days      
    #>  2 2021-12-22 Delhi                            125 2021-12-15     7 days      
    #>  3 2021-12-21 Delhi                            102 2021-12-14     7 days      
    #>  4 2021-12-20 Delhi                             91 2021-12-14     6 days      
    #>  5 2021-12-19 Delhi                            107 2021-12-14     5 days      
    #>  6 2021-12-18 Delhi                             86 2021-12-13     5 days      
    #>  7 2021-12-17 Delhi                             69 2021-12-13     4 days      
    #>  8 2021-12-16 Delhi                             85 2021-12-13     3 days      
    #>  9 2021-12-15 Delhi                             57 2021-11-27    18 days      
    #> 10 2021-12-14 Delhi                             45 2021-11-15    29 days      
    #> # … with 242 more rows
    

    reprex package (v0.3.0) 于 2021 年 12 月 25 日创建

    【讨论】:

    • 感谢@TimeTeaFan,这正是我想要的输出,但我实际上不确定我用于doubling 案例的逻辑。虽然你的实施很成功。非常感谢您的努力和帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2021-04-23
    • 2022-06-24
    相关资源
    最近更新 更多