2017-07-18 2 views
0

J'ai une trame de données de quelque 90 symboles financiers (3 utilisera pour simplifier) ​​R - Utiliser des noms dans une liste pour alimenter des objets nommés en boucle?

> View(syM)  
    symbol 
1 APPL 
2 YAHOO 
3 IBM 

J'ai créé une fonction qui obtient des données JSON pour ces symboles et produire une sortie. Fondamentalement:

nX <- function(x) { 
    #get data for "x", format it, and store it in "nX" 
    nX <- x 
    return(nX) 
} 

J'ai utilisé une boucle pour obtenir les données et stocker la série de zoo nommée après chaque symbole en conséquence.

for (i in 1:nrow(syM)) { 
    assign(x = paste0(syM[i,]), 
    value = nX(x = syM[i,])) 
    Sys.sleep(time = 1) 
} 

qui se traduit par:

[1] "APPL"   "YAHOO"   "IBM" 

Chacun d'eux est une série de zoo avec 5 colonnes de données.

En outre, je veux faire un peu de traçage à chaque série et sortir le résultat, de préférence en utilisant une boucle for ou quelque chose de mieux.

yN <- function(y) { 
    #plot "y" series, columns 2 and 3, and store it in "yN" 
    yN <- y[,2:3] 
    return(yN) 
} 

Suivant une logique similaire à ma boucle précédente J'ai essayé:

for (i in 1:nrow(syM)) { 
    assign(x = paste0(pairS[i,],".plot"), 
    value = yN(y = paste0(syM[i,]))) 
} 

Mais jusqu'à présent, les données ne sont pas envoyées à la fonction, seul le nom du symbole, donc je reçois naturellement:

y[,2:3] : incorrect number of dimensions 

J'ai aussi essayé:

for (i in 1:nrow(syM)) { 
    assign(x = paste0(syM[i,],".plot"), 
    value = yN(y = ls(pattern = paste0(syM[i,])))) 
} 

Avec des résultats similaires. Lorsque je saisis le nom de la série manuellement, le tracé du premier symbole est sauvegardé en tant que "APPL.Plot".

assign(paste0(syM[1,], ".Plot"), 
     value = yN(p = APPL)) 
+0

Vous avez sûrement omis d'inclure les appels à 'library' pour les différents paquets qui sont sous-entendus à charger pour cela. Aussi je suggère à l'avenir d'ajouter la sortie de 'dput' à' syM'. –

+0

Fera, merci.Je crois que la seule bibliothèque utilisée est 'library (quantmod)', mais c'est seulement pour obtenir les données pour les symboles. – MRGiacalone2005

Répondre

0

Comme vous le soulignez, vous appelez yN avec un argument de caractère:

for (i in 1:nrow(syM)) { 
    assign(x = paste0(pairS[i,],".plot"), 
    value = yN(y = paste0(syM[i,]))) 
} 

paste0(syM[i,]) va résoudre à un personnage et non le zoo objet, il semble que vous essayez de référence . Au lieu de cela, utiliser quelque chose comme get():

for (i in 1:nrow(syM)) { 
    assign(x = paste0(pairS[i,],".plot"), 
    value = yN(y = get(paste0(syM[i,])))) 
} 

Ou peut-être tout simplement stocker vos objets de zoo dans une liste en premier lieu, puis fonctionner sur tous les éléments de la liste avec quelque chose comme lapply() ...

+0

Merci! Cela a fait l'affaire. J'essayais d'éviter de les placer tous dans une seule liste avec 'lapply()'. La clé était d'utiliser 'get()' – MRGiacalone2005

+0

Great! Veuillez considérer la réponse comme acceptée si elle a fonctionné pour vous. Bravo –

1

Tenez compte lapply avec setNames pour créer une liste des objets de nX nommé retour:

nX_list <- setNames(lapply(syM$symbol, nX), syM$symbol) 

# OUTPUT ZOO OBJECTS BY NAMED INDEX 
nX_list$AAPL 
nX_list$YAHOO 
nX_list$IBM 

# CREATE SEPARATE OBJECTS FROM LIST 
# BUT NO NEED TO FLOOD GLOBAL ENVIR W/ 90 OBJECTS, JUST USE 1 LIST 
list2env(nX_list, envir=.GlobalEnv) 

pour la fonction de la parcelle, ajoutez d'abord un get l'intérieur fonction pour récupérer un objet par son nom de chaîne, puis exécutez la même manière lapply avec setNames:

yN <- function(y) { 
    #plot "y" series, columns 2 and 3, and store it in "yN" 
    yobj <- get(nX_list[[y]])  # IF USING ABOVE LIST 
    yobj <- get(y)    # IF USING SEPARATE OBJECT 

    yN <- yobj[,2:3] 
    return(yN) 
} 

plot_list <- setNames(lapply(syM$symbol, yN), paste0(syM$symbol, ".plot")) 

# OUTPUT PLOTS BY NAMED INDEX 
plot_list$AAPL.plot 
plot_list$YAHOO.plot 
plot_list$IBM.plot 

# CREATE SEPARATE OBJECTS FROM LIST 
# BUT NO NEED TO FLOOD GLOBAL ENVIR W/ 90 OBJECTS, JUST USE 1 LIST 
list2env(plot_list, envir=.GlobalEnv) 
+0

J'étais capable de le faire avec 'get()' avec 'paste0()'. J'ai utilisé la boucle 'for' principalement pour' assign() 'le nom de la liste des symboles à chaque série séparément. Je pense que je vais reconsidérer en utilisant 'lapply()' pour les lier tous ensemble. – MRGiacalone2005

+0

Mais votre option avec le _yobj_ utilisant 'get()' est bien meilleure. – MRGiacalone2005

+0

Comme je commente dans le code, ** une ** liste est beaucoup plus gérable que 90 objets inondant votre environnement global en particulier si les objets sont la même structure comme * zoo * de 5 cols. – Parfait