2017-02-15 2 views
0

Je dois calculer quelques calculs intermédiaires en utilisant R. Voici les données concernant certains événements et leurs types pendant quelques années.Calcul d'une valeur pour une ligne courante dans une base de données utilisant un sous-ensemble dans R

structure(list(year = c(1994, 1995, 1997, 1997, 1998, 1998, 1998, 
2000, 2000, 2001, 2001, 2002), N = c(3L, 1L, 1L, 4L, 1L, 1L, 
4L, 1L, 2L, 1L, 5L, 1L), type = c("OIL", "LNG", "AGS", "OIL", 
"DOCK", "LNG", "OIL", "LNG", "OIL", "LNG", "OIL", "DOCK")), .Names =  c("year", 
"N", "type"), row.names = c(NA, 12L), class = "data.frame") 


> head(mydf3) 
    year N type 
1 1994 3 OIL 
2 1995 1 LNG 
3 1997 1 AGS 
4 1997 4 OIL 
5 1998 1 DOCK 
6 1998 1 LNG 

J'ai besoin pour obtenir les données sur la somme cumulative de N par année et le type, la somme cumulée totale cette année et somme cumulative pour l'année en cours jusqu'à ce que tous les types.

donc j'ai besoin d'obtenir des informations comme ce

year type cntyear cnt_cumultype cnt_cumulalltypes 
1994 OIL 3 3 3 
1994 LNG 0 0 3 
1994 AGS 0 0 3 
1994 DOCK 0 0 3 
1995 OIL 0 3 4 
1995 LNG 1 1 4 
1995 AGS 0 0 4 
1995 DOCK 0 0 4 
... 

Quelques explications:

  1. cntyear - cela compte N pour l'année et le type de courant.
  2. cnt_cumultype - somme cumulative pour ce type jusqu'à l'année en cours.
  3. cnt_cumulalltypes - somme cumulative pour tous les types pour tous ans, y compris l'actuel < = année en cours.

Je voulais juste faire quelque chose comme ça, mais il n'a pas travaillé droit ...

mydf3$cnt_cumultype<-tail(cumsum(mydf3[which(mydf3$type==mydf3$type & mydf3$year==mydf3$year),]$N), n=1) 

Comment calculer ce nombre par lignes?

+1

S'il vous plaît passer un peu de temps pour expliquer le calcul de vos trois nouvelles variables. Votre sortie désirée n'est pas suffisante pour les distinguer (pour moi au moins). – lmo

+0

fait, ajouter quelques explications – twistfire

+0

Donc, dans votre sortie désirée, ne devrait pas 1995 huile 3 pour cnt_cumultype? – lmo

Répondre

0

Voici une solution avec le package data.table. Ceci est également possible de résoudre en base R, mais une étape en particulier est plus courte avec data.table.

# load library 
library(data.table) 
# caste df as a data.table and change column order 
setcolorder(setDT(df), c("year", "type", "N")) 
# change column names 
setnames(df, names(df), c("year", "type", "cntyear")) 

# get all type-year combinations in data.table with `CJ` and join these to original 
# then, in second [, replace all observations with missing counts to 0 
df2 <- df[CJ("year"=unique(df$year), "type"=unique(df$type)), on=c("year", "type") 
      ][is.na(cntyear), cntyear := 0] 
# get cumulative counts for each type 
df2[, cnt_cumultype := cumsum(cntyear), by=type] 
# get total counts for each year 
df2[, cnt_cumulalltypes := cumsum(cntyear)] 

Il en résulte

df2 
    year type cntyear cnt_cumultype cnt_cumulalltypes 
1: 1994 AGS  0    0     0 
2: 1994 DOCK  0    0     0 
3: 1994 LNG  0    0     0 
4: 1994 OIL  3    3     3 
5: 1995 AGS  0    0     3 
6: 1995 DOCK  0    0     3 
7: 1995 LNG  1    1     4 
8: 1995 OIL  0    3     4 
9: 1997 AGS  1    1     5 
    .... 
+0

merci, je vais essayer. il y a une autre question, comment calculer cnt_cumulalltypes - il doit être calculé pour toutes les années jusqu'à ce jour. par exemple. pour 1995 - la somme totale de toutes les années <= 1995 doit être calculée. – twistfire