2017-09-01 1 views
0

J'ai deux dataframesSéries temporelles: Quelle est la manière la plus efficace d'écrire du code pour les sous-ensembles?

DF1

time x y state 
... ... ... CA 
... ... ... MA 
... ... ... TX 
... ... ... MA 
... ... ... CA 
... ... ... IL 

DF2

time x y state 
... ... ... MA 
... ... ... NY 
... ... ... MA 
... ... ... TX 
... ... ... CA 
... ... ... CA 

J'ai alors un code où j'agrègent les valeurs mensuelles, renommer des colonnes, des données de correspondance avec une autre liste, puis fusionner DF1 et df2 en un dans environ 50 lignes de code. Ici, je ne considère pas state jusqu'à présent. Cependant, j'ai besoin de créer des sous-ensembles de la trame de données fusionnée pour plusieurs états américains. Existe-t-il un moyen plus élégant que copier/coller le code utilisé pour df1 et df2 et remplacer df1 et df2 par df1_CA, df2_MA, etc.

Boucle? Données du panel?

+1

Avoir une fonction 'look at' split' puis 'lapply' (ou boucle). 'split (df1, df1 $ state)' –

+0

Utiliser 'group_by' dans' dplyr' pourrait convenir ici – Edwin

+0

Ce serait génial si vous pouviez fournir un petit exemple reproductible. Je suis désolé, je ne peux pas fournir mon code d'origine. – Fanny

Répondre

1

Une option pourrait être d'utiliser le package data.table pour les analyses groupées.

# transform your data.frame to data.table 
dt1 <- as.data.table(df1) 
dt2 <- as.data.table(df2) 

# e.g. grouping values on state level 
dt1[, sum(y), by=state] 
# this will accumulate all y values by state 

Si vous ne souhaitez pas remplacer le nom df dans votre code, vous pouvez définir une fonction:

# define the function 
accumulate <- function(df){ 
    dt <- as.data.table(df) 
    return(dt[, sum(y), by=state]) 
} 

# and call it 
accumulate(df1) 
accumulate(df2) 

au lieu d'une boucle ou similaire sur tous vos data.frames, un pourrait utiliser l'une des fonctions d'application qui itèrent efficacement à travers les structures de données, par ex. Listes

# alternatively define a list of data.frames and then iterate over the list 
my.dfs <- list(df1,df2) 
lapply(my.dfs, accumulate(df))