2016-11-14 1 views
0

J'ai l'ensemble de données ci-dessous, j'essaie de trouver le nombre de jours où chaque machine était active et en mode veille basé sur SwitchedOnDate.Compte sur chaque groupe correspondant aux critères R

MachineID InstalledDate SwitchedOnDate Status 
1   2010-02-18 2010-02-19 SleepMode 
1   2010-02-18 2010-02-20 Active 
1   2010-02-18 2010-02-21 SleepMode 
1   2010-02-18 2010-02-22 Active 
2   2010-02-20 2010-02-21 Active 
2   2010-02-20 2010-02-22 SleepMode 
3   2010-02-10 2010-02-18 SleepMode 
4   2010-03-10 2010-03-15 Active 

Alors ma sortie devrait ressembler à quelque chose comme ça,

MachineID SleepModeDays ActiveDays 
1   2    2 
2   1    1 
3   1    0 
4   0    1 

Répondre

1

Vous pouvez utiliser count pour grouper et compter les occurrences de chaque niveau de la dernière variable que vous passez, puis spread pour réorganiser les données à large forme:

library(tidyverse) 

df %>% count(MachineID, Status) %>% spread(Status, n, fill = 0L) 

## Source: local data frame [4 x 3] 
## Groups: MachineID [4] 
## 
## MachineID Active SleepMode 
## *  <int> <int>  <int> 
## 1   1  2   2 
## 2   2  1   1 
## 3   3  0   1 
## 4   4  1   0 

Une base R alternatif:

tab <- table(df$MachineID, df$Status) 

data.frame(MachineID = rownames(tab), as.data.frame.matrix(tab)) 

## MachineID Active SleepMode 
## 1   1  2   2 
## 2   2  1   1 
## 3   3  0   1 
## 4   4  1   0 

ou pour une route très directe,

janitor::crosstab(df, MachineID, Status) 

## MachineID Active SleepMode 
## 1   1  2   2 
## 2   2  1   1 
## 3   3  0   1 
## 4   4  1   0 

Remarque ces fait quelques Approches hypothèses, par exemple que vous ne pouvez pas avoir plusieurs occurrences de la même combinaison de MachineID, SwitchedOnDate et Status. Si vos données deviennent plus compliquées, tenez-en compte.

0

utilisant data.table pour l'agrégation et la fonction dcast, voici une autre solution:

library(data.table) 
data <- "MachineID InstalledDate SwitchedOnDate Status 
1   2010-02-18 2010-02-19 SleepMode 
1   2010-02-18 2010-02-20 Active 
1   2010-02-18 2010-02-21 SleepMode 
1   2010-02-18 2010-02-22 Active 
2   2010-02-20 2010-02-21 Active 
2   2010-02-20 2010-02-22 SleepMode 
3   2010-02-10 2010-02-18 SleepMode 
4   2010-03-10 2010-03-15 Active" 

data <- read.table(textConnection(data), header=TRUE) 
setDT(data) 
dcast(data[, .N, by=.(MachineID, Status)], MachineID ~ Status, fill=0, value.var="N") 
+0

La réponse reflète la solution fournie. Dans le code, la colonne SwitchedOnDate ne joue aucun rôle. S'il vous plaît clarifier, si la colonne SwitchedOnDate doit également être considérée. –

+1

Vous n'avez pas besoin de '.N' car' dcast' a un paramètre 'fun.aggregate', qui vaut par défaut' longueur' (voir [ici] (http://stackoverflow.com/questions/33051386/dcast-restructuring -de-long-à-large-format-ne-travaillant/33051521 # 33051521) pour une explication). – Jaap

+0

Salut Salut. Oui, l'idée est de savoir "Pour chaque machine, combien de jours différents il était en mode sommeil et combien de jours différents il était en mode actif" –