Как я могу хранить очень маленькие числа в списке после просмотра значений в R? - PullRequest
0 голосов
/ 27 марта 2020

Я проанализировал текущие данные (ecd c .europa.eu / ru / публикации-данные / download-todays-data-geographi c -distribution-covid-19-падеж-по всему миру) из Европейского центра Профилактика и контроль заболеваний, которые отслеживают случаи COVID-19 по месяцам и странам. Таким образом, я хотел бы получить представление о распространении активных случаев, а также о том, как они связаны со смертями, связанными с заболеванием. Моя цель: создать переменную, в которой будет храниться процентная доля смертей от общего числа инфекций за каждый день в марте, разделенная на страны.

Вот мой код:

library(readxl)
d <- read_excel("C:/Users/hanna/Downloads/COVID-19-geographic-disbtribution-worldwide.xlsx")
#View(d)

corona_de <- d %>% filter(`Countries and territories` == "Germany" & Month == 3)

# explore the data
library(skimr)
skim(corona_de)

library(ggplot2)
ggplot(corona_de, aes (x = Day, y = Cases)) +
  geom_line(color = "red")+ theme_classic()

# deutschland, england, spanien, italien, frankreich, österreich
corona <- d %>% filter(`Countries and territories` == "Germany" |
                      `Countries and territories` == "France" |
                      `Countries and territories` == "Italy" |
                      `Countries and territories` == "Spain") #filter for month later %>% filter(Month == 3) 
#----------------------------------------------------------------
# Preprocess data and create cumulative and percent variables
#----------------------------------------------------------------
# format dates
library(lubridate)
corona$DateRep <-as.Date(corona$DateRep,"%Y-%m-%d UTC")
# store in list for later
dates <- corona_march$DateRep
# store countries list to loop through
countries <- unique(corona$`Countries and territories`)
#create empty objects
active_cases<- NULL
deaths_cum <- NULL
active_percent <- NULL
death_percent <- NULL

#loop through number of countries 
for (c in 1:4){
  current_country <- subset(corona_march, `Countries and territories` == countries[c])
  # loop trhough days of march
  for (i in 25:1){
    # get new cases, deaths and population size for that day
    current_interval = current_country %>% filter(DateRep >= dates[i])
    current_case = current_interval %>% select(Cases)
    current_death = current_interval %>% select(Deaths)
    pop = current_country %>% filter(DateRep == dates[i]) %>% select(Pop_Data.2018)

    # calculate cumulative cases, deaths and percent active 
    active_cum = sum(current_case$Cases) 
    percent_active = active_cum / pop[[1]]
    cum_death = sum(current_death)
    # avoid scientific notation
    options("scipen"=100, "digits"=7)
    percent_death = cum_death / pop[[1]]

    # store variables in list
    active_cases <- append(active_cases,active_cum)
    deaths_cum <- append(deaths_cum,cum_death)
    active_percent <- append(active_percent,percent_active)
    percent_death <- append(death_percent, percent_death)
  }
}

Удивительно, но все работает отлично, за исключением переменной %_датины. Для кумулятивных смертей вывод выглядит следующим образом:

deaths_cum
  [1] 1098 1098 1098 1097 1096 1096 1093 1091 1090 1081 1070 1067 1052 1039 1021 1009  973
 [18]  952  925  856  728  650  538  426  240  149  149  149  149  149  149  149  149  149
 [35]  149  147  147  146  144  144  141  137  136  136  136  106  104   82   55   23 6799
 [52] 6791 6785 6768 6740 6713 6672 6623 6587 6454 6356 6189 5993 5804 5552 5379 5009 4662
 [69] 4315 3842 3413 2788 1993 1344  743 2696 2696 2696 2696 2696 2695 2693 2691 2691 2691
 [86] 2668 2661 2649 2612 2575 2560 2408 2387 2205 2098 1929 1694 1370  976  514

Но для переменной процент_смерти кажется, что он останавливается после 1 итерации:

> percent_death
[1] 0.00001100083

Любой Идея, что случилось? Почему функция добавления работает для всех переменных, кроме небольших чисел? Есть ли более умный способ сделать это?

1 Ответ

0 голосов
/ 02 апреля 2020

Теперь я нашел изящный способ выполнения вычислений с помощью data.table, который я не нашел бы без первоначального совета Грегора Томаса.

  1. изменение имен объектов на более различимые
  2. избегайте научного c обозначения малых значений с помощью option ()
  3. используйте data.table вместо нескольких циклов, чтобы уменьшить сложность и сделать код чище
corona <- d %>% filter(`Countries and territories` %in% c("Germany", "France", "Italy", "Spain") )
corona_march <- corona %>% filter(Month == 3)

library(data.table)
corona_table <- data.table(corona_march)

# for each country in corona_march, calculate the cumulative cases, percent_active, cumulative deaths and percent deathsbased on the dates
corona_table[, Active_cases := cumsum(Cases), by = .(`Countries and territories`,Day)]
corona_table[, Deaths_cumulative := cumsum(Deaths), by = .(`Countries and territories`,Day)]
# avoid scientific notation for percentages
options("scipen"=100, "digits"=7)
corona_table[, Percent_active := Active_cases/Pop_Data.2018, by = .(`Countries and territories`,Day)]
corona_table[, Percent_death := Deaths_cumulative/Active_cases, by = .(`Countries and territories`,Day)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...