С помощью какого кода я могу узнать, сколько людей умерло в предыдущий день? - PullRequest
0 голосов
/ 03 мая 2020

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

df <- read.csv ('https://raw.githubusercontent.com/ulklc/covid19-timeseries/master/countryReport/raw/rawReport.csv')

Я пытаюсь напечатать, сколько людей умерло вчера.

df1 <- aggregate(death~countryName, subset(df, region =="Europe"), sum)

собирает этот код каждый день и дает его. Я не хочу их сумму. С помощью какого кода я могу узнать, сколько людей умерло в предыдущий день?

Ответы [ 2 ]

1 голос
/ 03 мая 2020

* * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * *
df1 <- subset(df, region =="Europe" & day == '2020/05/02')
head(df1)
#             day countryCode            countryName region      lat      lon confirmed recovered death
# 102  2020/05/02          AD                Andorra Europe 42.50000  1.50000       747       472    44
# 612  2020/05/02          AL                Albania Europe 41.00000 20.00000       789       519    31
# 1020 2020/05/02          AT                Austria Europe 47.33333 13.33333     15558     13180   596
# 1428 2020/05/02          BA Bosnia and Herzegovina Europe 44.00000 18.00000      1839       779    72
# 1734 2020/05/02          BE                Belgium Europe 50.83333  4.00000     49517     12211  7765
# 1938 2020/05/02          BG               Bulgaria Europe 43.00000 25.00000      1594       287    72
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 *) * *
  1. Поскольку каждая строка для данной страны является промежуточной суммой, то использование sum в качестве метода агрегирования логически некорректно при просмотре нескольких дней; и
  2. Поскольку вам нужны данные за один день, нет необходимости aggregate, мы можем просто subset данные.

«Доказательство»:

tail(sort(df$day), n=1)
# [1] 2020/05/02
# 102 Levels: 2020/01/22 2020/01/23 2020/01/24 2020/01/25 ... 2020/05/02
head( subset(df, region == "Europe" & day == "2020/05/02") )
#             day countryCode            countryName region      lat      lon confirmed recovered death
# 102  2020/05/02          AD                Andorra Europe 42.50000  1.50000       747       472    44
# 612  2020/05/02          AL                Albania Europe 41.00000 20.00000       789       519    31
# 1020 2020/05/02          AT                Austria Europe 47.33333 13.33333     15558     13180   596
# 1428 2020/05/02          BA Bosnia and Herzegovina Europe 44.00000 18.00000      1839       779    72
# 1734 2020/05/02          BE                Belgium Europe 50.83333  4.00000     49517     12211  7765
# 1938 2020/05/02          BG               Bulgaria Europe 43.00000 25.00000      1594       287    72
head( subset(df, region == "Europe" & day == "2020/05/01") )
#             day countryCode            countryName region      lat      lon confirmed recovered death
# 101  2020/05/01          AD                Andorra Europe 42.50000  1.50000       745       468    43
# 611  2020/05/01          AL                Albania Europe 41.00000 20.00000       782       488    31
# 1019 2020/05/01          AT                Austria Europe 47.33333 13.33333     15531     13110   589
# 1427 2020/05/01          BA Bosnia and Herzegovina Europe 44.00000 18.00000      1781       755    70
# 1733 2020/05/01          BE                Belgium Europe 50.83333  4.00000     49032     11892  7703
# 1937 2020/05/01          BG               Bulgaria Europe 43.00000 25.00000      1555       276    68

Если вам нужен только столбец death, вы всегда можете select= столбцы:

df1 <- subset(df, region =="Europe" & day == '2020/05/02', select = c(countryName, death))
head(df1)
#                 countryName death
# 102                 Andorra    44
# 612                 Albania    31
# 1020                Austria   596
# 1428 Bosnia and Herzegovina    72
# 1734                Belgium  7765
# 1938               Bulgaria    72

Если вы ищете разницу между вчера и предыдущий отчетный номер (который должен быть «днем ранее», но ничего не проверено), тогда dplyr решение может быть

library(dplyr)
as_tibble(df) %>%
  arrange(day) %>%
  group_by(countryCode) %>%
  mutate_at(vars(confirmed, recovered, death), list(~ c(NA, diff(.)))) %>%
  slice(n())
# Warning: Factor `countryCode` contains implicit NA, consider using `forcats::fct_explicit_na`
# Warning: Factor `countryCode` contains implicit NA, consider using `forcats::fct_explicit_na`
# # A tibble: 212 x 9
# # Groups:   countryCode [212]
#    day        countryCode countryName          region     lat   lon confirmed recovered death
#    <fct>      <fct>       <fct>                <fct>    <dbl> <dbl>     <int>     <int> <int>
#  1 2020/05/02 AD          Andorra              Europe    42.5   1.5         2         4     1
#  2 2020/05/02 AE          United Arab Emirates Asia      24    54         561       121     8
#  3 2020/05/02 AF          Afghanistan          Asia      33    65         134        21     4
#  4 2020/05/02 AG          Antigua and Barbuda  Americas  17.0 -61.8         0         0     0
#  5 2020/05/02 AI          Anguilla             Americas  18.2 -63.2         0         0     0
#  6 2020/05/02 AL          Albania              Europe    41    20           7        31     0
#  7 2020/05/02 AM          Armenia              Asia      40    45         125        33     0
#  8 2020/05/02 AO          Angola               Africa   -12.5  18.5         5         0     0
#  9 2020/05/02 AR          Argentina            Americas -34   -64           0        28     4
# 10 2020/05/02 AT          Austria              Europe    47.3  13.3        27        70     7
# # ... with 202 more rows

Я думаю, что это безопасное предположение, но я полагаюсь на сортировка неформатированных day здесь. Всегда можно было явно преобразовать класс Date с помощью mutate(day = as.Date(day, format = "%Y/%m/%d")) до arrange, чтобы быть "полным".

И поскольку я бросил себе вызов go на месяцы, чтобы стать более опытным с data.table, Вот альтернативное решение на этом диалекте. (Обратите внимание, что я использую оператор magrittr %>% здесь, чтобы разбить каждый этап обработки; это легко сделать без более традиционной data.table -цепной обработки.)

library(data.table)
cols <- c("confirmed", "recovered", "death")
as.data.table(df) %>%
  .[, (cols) := lapply(.SD, function(a) c(NA, diff(a))), by = .(countryName), .SDcols = cols] %>%
  .[, .SD[.N,], by = .(countryName) ]
#               countryName        day countryCode   region       lat       lon confirmed recovered death
#   1:              Andorra 2020/05/02          AD   Europe  42.50000   1.50000         2         4     1
#   2: United Arab Emirates 2020/05/02          AE     Asia  24.00000  54.00000       561       121     8
#   3:          Afghanistan 2020/05/02          AF     Asia  33.00000  65.00000       134        21     4
#   4:  Antigua and Barbuda 2020/05/02          AG Americas  17.05000 -61.80000         0         0     0
#   5:             Anguilla 2020/05/02          AI Americas  18.25000 -63.16667         0         0     0
#  ---                                                                                                   
# 208:                Yemen 2020/05/02          YE     Asia  15.00000  48.00000         3         0     0
# 209:              Mayotte 2020/05/02          YT   Africa -12.83333  45.16667         0         0     0
# 210:         South Africa 2020/05/02          ZA   Africa -29.00000  24.00000       385       167     7
# 211:               Zambia 2020/05/02          ZM   Africa -15.00000  30.00000        10         1     0
# 212:             Zimbabwe 2020/05/02          ZW   Africa -20.00000  30.00000        -6         0     0
0 голосов
/ 03 мая 2020

Написать вспомогательную функцию yesterday и использовать ее для подмножества данных.

yesterday <- function() Sys.Date() - 1L
yesterday()
# [1] "2020-05-02"

df1 <- aggregate(death ~ countryName, subset(df, region =="Europe" & day == yesterday()), sum)

A dplyr решение:

library(dplyr)

df %>% 
  filter(day == yesterday(), region == "Europe") %>%
  group_by(countryName) %>%
  summarise(death = sum(death))

Данные

Следующий Комментарий r2evans , вот код чтения данных и преобразования даты.

df <- read.csv ('https://raw.githubusercontent.com/ulklc/covid19-timeseries/master/countryReport/raw/rawReport.csv')
df$day <- as.Date(df$day, "%Y/%m/%d")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...