Возврат записей фрейма данных на основе максимальной даты и / или максимальных значений (пример данных COVID-19) - PullRequest
0 голосов
/ 08 мая 2020
df <- read.csv ('https://raw.githubusercontent.com/ulklc/covid19-timeseries/master/countryReport/raw/rawReport.csv',
                stringsAsFactors = FALSE)

Я нашел этот код, который находит в этом коде страны, сообщившие о наибольшем количестве смертей и восстановленных по регионам.

    yesterday <- function() Sys.Date() - 1L
    yesterday()
    # [1] "if it doesn't work yesterday()-1  do it" 

    library(tidyverse)
    death_df <- df %>%
    filter(as.Date(day) == yesterday()) %>%
    group_by(region) %>%
    filter(death == max(death)) %>%
    select(Date = day,
         countryName,
         region,
         death,
         recovered)

     recovered_df <- df %>%
     filter(as.Date(day) == yesterday()) %>%
    group_by(region) %>%
    filter(recovered == max(recovered)) %>%
    select(Date = day,
         countryName,
         region,
         death,
         recovered)

    full_df <- bind_rows(death_df, recovered_df)

Однако мне нужно найти страны, которые сообщают о большинство смертей и восстановлено в мире в целом.

Вот результат, который я ищу:

date            countryName       death        recovered
2020/05/06       united State   **19580**        500
2020/05/06       İran             11500        **98567**

Обратите внимание, что эти значения не настоящие.

Данные набор обновляется ежедневно. Однако он мог не обновляться в течение 1-2 дней. обратим на это внимание.

Ответы [ 2 ]

0 голосов
/ 02 июня 2020

Приведенный ниже код выберет запись с максимальным ежедневным death и максимальным ежедневным recovered для максимального date в данных.

## call the dplyr library
library(dplyr)
## read the data into R
df <- read.csv ('https://raw.githubusercontent.com/ulklc/covid19-timeseries/master/countryReport/raw/rawReport.csv', stringsAsFactors = FALSE)
## determine the max date contained within the data
max.date <- df[which.max(as.Date(df$day)),"day"]
## copy the data to preserve original
df1 <- df 
## filter the data to only entries from the max day
df1 <- filter(df1, as.Date(date, "%Y/%m/%d") == as.Date(max.date))
## determine the entry with the most deaths
max.deaths <- df1[which.max(df1$death),]
## format the number of deaths as given in the example
max.deaths$death <- paste0("**",max.deaths$death,"**")
## determine the entry with the most recovered
max.recovered <- df1[which.max(df1$recovered),]
## format the number recovered to match the format of the example
max.recovered$recovered <- paste0("**",max.recovered$recovered,"**")
## create a data frame containing our max death and max recovered entries
max.records <- rbind(max.deaths, max.recovered)
## attach a column with the max date which corresponds to the date of the entries selected
max.records$date <- max.date
## organize the data as shown in the example
max.records <- select(max.records, c("day","countryName","death","recovered"))

И этот код будет вычислять агрегат (или всего) смертей как totalDeaths и совокупно восстановленных как totalRecovered для каждой страны. Затем он возвращает запись с максимальным totalDeath и максимальным totalRecovered с максимальной датой в данных.

## call the dplyr library
library(dplyr)
## read the data into R
df <- read.csv ('https://raw.githubusercontent.com/ulklc/covid19-timeseries/master/countryReport/raw/rawReport.csv', stringsAsFactors = FALSE)
## determine the max date contained within the data
max.date <- df[which.max(as.Date(df$day)),"day"]
## copy the data to preserve the original
df1 <- df 
## group the data by countries
df1 <- group_by(df1, countryName)
## sum the death and recovered of each country
df1 <- summarise(df1, totalDeaths = sum(death), totalRecovered = sum(recovered))
## ungroup your data to avoid errors
df1 <- ungroup(df1)
## determine country with most total deaths reported
max.deaths <- df1[which.max(df1$totalDeaths),]
## format death numbers to match example
max.deaths$totalDeaths <- paste0("**",max.deaths$totalDeaths,"**")
## determine country with most total recovered reported
max.recovered <- df1[which.max(df1$totalRecovered),]
## format recovered numbers to match example
max.recovered$totalRecovered <- paste0("**",max.recovered$totalRecovered,"**")
## create a data frame containing our max entries
max.records <- rbind(max.deaths, max.recovered)
## attach a column with the max date which corresponds to the most current date the data reports
max.records$date <- max.date
## organize the data as shown in the example
max.records <- select(max.records, c("day","countryName","death","recovered"))

Примечание: оба метода полагаются на пакет dplyr R. dplyr можно установить, запустив install.packages(dplyr) в R или RStudio.

Надеюсь, это поможет!

0 голосов
/ 08 мая 2020

Это подход к вычислению информации, которую вы запрашиваете каждый день, с использованием dplyr.

library(dplyr)
result <- df %>% group_by(day) %>% 
  filter(death == max(death) | recovered == max(recovered)) %>%
  mutate(death = case_when(death == max(death) ~ paste0("**",death[death == max(death)],"**"),
                           TRUE ~ as.character(death)),
         recovered = case_when(recovered == max(recovered) ~ paste0("**",recovered[recovered == max(recovered)],"**"),
                           TRUE ~ as.character(recovered)))
result %>%
  filter(day == "2020/04/06")
# A tibble: 2 x 9
# Groups:   day [1]
  day        countryCode countryName region   lat   lon confirmed recovered death    
  <chr>      <chr>       <chr>       <chr>  <dbl> <dbl>     <int> <chr>     <chr>    
1 2020/04/06 CN          China       Asia    35   105       81708 **77029** 3331     
2 2020/04/06 IT          Italy       Europe  42.8  12.8    132547 22837     **16523**
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...