Найти первое значение, которое соответствует определенным критериям - PullRequest
1 голос
/ 26 марта 2020

У меня есть набор данных по случаям Coivd-19 и смертям по дням и странам. Я sh найду дату, когда произошла первая смерть для каждой страны, и отфильтрую все предыдущие дни. Как бы вы решили эту проблему в R / Tidyverse?

library(readxl)
library(httr)
url <- paste("https://www.ecdc.europa.eu/sites/default/files/documents/COVID-19-geographic-disbtribution-worldwide-",format(Sys.time(), "%Y-%m-%d"), ".xlsx", sep = "")
GET(url, authenticate(":", ":", type="ntlm"), write_disk(tf <- tempfile(fileext = ".xlsx")))
df <- read_excel(tf)

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Попробуйте:

library(dplyr) 
# or library(tidyverse)

df %>%
  arrange(`Countries and territories`, DateRep) %>%
  group_by(`Countries and territories`) %>%
  mutate(Cumulative_Death = cumsum(Deaths)) %>%
  ungroup() %>%
  filter(Cumulative_Death > 0) %>%
  group_by(`Countries and territories`) %>%
  mutate(First_Death_Date = min(DateRep)) 

Добавлены новые столбцы Cumulative_Death: сумма смертей до DateRep и First_Death_Date: дата первой смерти в каждой стране

0 голосов
/ 26 марта 2020

Поскольку данные предварительно отсортированы по убыванию, вы можете найти индекс строки последней смерти и сохранить номера строк равными или меньшими, чем это значение.

df %>%
  group_by(`Countries and territories`) %>%
  filter(any(Deaths > 0)) %>%
  filter(row_number() <= max(which(Deaths > 0)))

# A tibble: 1,111 x 9
# Groups:   Countries and territories [95]
   DateRep               Day Month  Year Cases Deaths `Countries and territories` GeoId Pop_Data.2018
   <dttm>              <dbl> <dbl> <dbl> <dbl>  <dbl> <chr>                       <chr>         <dbl>
 1 2020-03-25 00:00:00    25     3  2020     2      0 Afghanistan                 AF         37172386
 2 2020-03-24 00:00:00    24     3  2020     6      1 Afghanistan                 AF         37172386
 3 2020-03-25 00:00:00    25     3  2020    23      1 Albania                     AL          2866376
 4 2020-03-24 00:00:00    24     3  2020    11      2 Albania                     AL          2866376
 5 2020-03-23 00:00:00    23     3  2020    13      0 Albania                     AL          2866376
 6 2020-03-22 00:00:00    22     3  2020     6      0 Albania                     AL          2866376
 7 2020-03-21 00:00:00    21     3  2020     0      0 Albania                     AL          2866376
 8 2020-03-20 00:00:00    20     3  2020    11      0 Albania                     AL          2866376
 9 2020-03-19 00:00:00    19     3  2020     4      1 Albania                     AL          2866376
10 2020-03-18 00:00:00    18     3  2020     4      0 Albania                     AL          2866376
# ... with 1,101 more rows
0 голосов
/ 26 марта 2020
library(dplyr)

df <- df %>% 
      arrange(DateRep) %>% 
      distinct(`Countries and territories`, .keep_all = TRUE)

Я думаю, что это самый простой вариант для вас. dplyr::distinct() удаляет все, кроме первой строки, поэтому, если вы упорядочите данные по нужному столбцу, вы получите только первое совпадение. .keep_all = TRUE сохранит все столбцы, а не только те, которые указаны в distinct().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...