0
votes

Opérations de style dplyr efficaces

J'ai ces deux tables d'exemple de jouet:
Tableau 1:

#Only include absences because it will be a smaller dataset
att_ws_alt <- inner_join(attendance_events, all_students[,c("student_id","grade_level")], by = "student_id") %>%
              filter(attendance == 0)

#Set days to check between
date_from <- "2020-02-01"
date_to <- "2020-02-02"

#Continously pipe to not have to store and reference(?)
att_drop_alt <- att_ws_alt %>%
                filter(dates %in% c(date_from, date_to)) %>%
                group_by(grade_level,dates) %>%
                summarize(absence_bydate = n()) %>%
                dcast(grade_level ~ dates) %>% 
                sapply(FUN = function(x) { x[is.na(x)] <- 0; x}) %>%
                as.data.frame() %>%
                mutate("absence_change" = .[,3] - .[,2]) %>%
                select(grade_level, absence_change) %>%
                arrange(desc(absence_change))
>att_drop_alt
  grade_level absence_change
1          10              2
2          11              1
3           9              0


2 commentaires

Ne voudriez-vous pas évaluer la présence / absence Relative Changements? Je veux dire si vous (extrêmement hypothétiquement à des fins de démonstration uniquement) tripler le nombre d'élèves en année et réduire de moitié l'absence relative , l'absence totale augmenterait toujours? Désolé si je suis mal interprété quelque chose


Ouais, je suis d'accord, mais c'est juste la question. Je suppose que le comptoir est si la décision que vous devez faire est sur une base étudiante, alors vous vous souciez de chiffres absolus plutôt que des pourcentages.


3 Réponses :


2
votes

Je suppose que c'est un peu plus concis: xxx

bien sûr, si vous souhaitez compter des absences au lieu des présentations, mettez simplement un signe moins devant le Diff < / code> sur la dernière ligne.


4 commentaires

Ouais c'est génial, je n'ai pas vraiment pensé à différer () être utilisé à la verticalement comme ça. Je pensais que je pouvais seulement avoir le changement après avoir obtenu les deux chiffres que je voulais côte à côte. Attendra plus de réponses avant de marquer cela comme correct


Je pense que cela doit être la version la plus courte de ce code! Malheureusement, je n'ai pas pu obtenir diff pour travailler dans ma réponse ... toujours pas sûr pourquoi


@dario I I Seulement de l'absence avec DIFF parce que j'utilisais Résumé où chaque groupe n'a que deux dates, elle donne donc une valeur unique. Cette méthode ne fonctionnera pas sur plusieurs dates.


Je t'ai eu! Merci pour l'excellente explication! Il y a maintenant une réponse de données databl encore plus courte. Ce que j'aimerais maîtriser un jour. Mais jusque-là, le code me considère comme ASCII Art et prend pour toujours lire;)



2
votes

Désolé si cela ne veut pas em> répondez à votre question, mais je ne voudrais pas accuser injustement les élèves d'être plus absents, alors ils étaient;)

library(dplyr)
all_students %>% 
  left_join(attendance_events) %>% 
  mutate(dates = as.Date(dates)) %>% 
  group_by(grade_level, dates) %>% 
    summarise(NAbs = sum(ifelse(attendance == 0, 1, 0)),
              N = n(),
              pctAbs = NAbs / n() * 100) %>% 
  arrange(dates) %>%
  mutate(change =  pctAbs - lag(pctAbs)) %>% 
  ungroup() %>% 
  arrange(change)



  # A tibble: 6 x 6
    dates      grade_level  NAbs     N pctAbs change
   <date>           <dbl> <dbl> <int>  <dbl>  <dbl>
  1 2020-02-02           9     1     2     50      0
  2 2020-02-02          11     1     2     50     50
  3 2020-02-02          10     2     2    100    100
  4 2020-02-01           9     1     2     50     NA
  5 2020-02-01          10     0     2      0     NA
  6 2020-02-01          11     0     2      0     NA


1 commentaires

Oui, c'est un peu plus robuste que ma version @dario. J'essayais de le garder court, mais peut-être que cela nécessite simplement ce petit effort supplémentaire.



3
votes

avec data.table xxx


0 commentaires