2017-01-20 5 views
0

Je suis assez nouveau pour R et j'essaie d'obtenir les sorties d'une fonction d'ondelettes sur mes données. Mes données sont structurées comme [152, 90], 152 points de temps à partir de 90 variables. Je voudrais transformer chaque série chronologique (colonnes) en ondelettes. J'ai été capable d'obtenir des ondelettes pour 1 timeseries et j'ai essayé de faire une boucle dans les colonnes et d'obtenir les 4 sorties différentes que je veux dans différentes variables.Obtention de différentes variables à partir de sorties de fonctions d'ondelettes dans R

data <- read.table(data.txt,sep = "\t") 
rois <- seq(1,90,by = 1) 
for (i in 1:length(rois)) { 
a <- data[,i] 
b <- wavMODWT(a, wavelet = "s14", n.levels = 4) 
data1.d1[i] <- b$data$d1 
data1.d2[i] <- b$data$d2 
data1.d3[i] <- b$data$d3 
data1.d4[i] <- b$data$d4 
} 

J'espérais que cela me donnerait un 152 x 90 matrice/dataframe pour chaque "d" sortie de la fonction wavMODT. Je reçois l'erreur "data1 [i] < - b $ data $ d1: objet 'data1' introuvable J'ai essayé de faire de data1 une liste vide mais j'ai eu une autre erreur" nombre d'éléments à remplacer n'est pas un multiple de longueur de remplacement ».

aussi, serait-ce un bon moment pour utiliser les fonctions apply() depuis que je suis en train d'appliquer une fonction sur plusieurs colonnes?

Toute aide serait grandement appréciée. Merci

Editer: voici mes exemples de données La fonction prend la colonne V1 comme entrée et sort 4 vecteurs colonnes de même longueur (b $ données $ 1 à b $ données $ 4) La fonction wavMODWT est dans le paquet: wmtsa

V1  V2  V3  V4  V5  V6 
1 1321.837 1353.712 1250.450 1183.120 1263.095 1298.410 
2 1327.204 1360.711 1249.475 1181.297 1266.686 1294.568 
3 1328.402 1362.084 1249.310 1177.071 1271.967 1295.823 
4 1327.890 1366.335 1248.203 1173.392 1273.039 1295.118 
5 1327.157 1370.059 1252.110 1177.771 1274.428 1300.177 
6 1329.278 1370.950 1250.477 1177.238 1277.021 1294.408 
7 1330.106 1363.459 1247.602 1176.267 1272.182 1296.256 
8 1327.378 1364.607 1248.047 1178.523 1271.818 1293.098 
9 1327.867 1363.442 1245.530 1175.825 1268.713 1295.788 
+0

En outre, j'ai 211 sujets chacun avec 152 points de temps à partir de 90 variables. Y at-il un raccourci que je peux prendre pour obtenir les sorties d'ondelettes de chaque sujet sans boucle for? – dj20

+0

Pouvez-vous fournir un petit exemple reproductible de vos données? Cela rendrait la réponse à votre question beaucoup plus facile. – BLT

+0

Merci d'avoir répondu @BLT. J'ai édité la question principale pour inclure un échantillon de mes données. – dj20

Répondre

1

Depuis wavMODWT retourne un objet de classe wavTransform, j'ai joué avec cet objet dans la console R intégré sur la page docs. Pensez à utiliser lapply pour obtenir une liste de trames de données contenant chacune 4 colonnes pour les vecteurs de coefficients. Le nombre de trames de données serait égal au nombre de colonnes que vous passez dans lapply, en particulier vos entrées de séries temporelles, donc N = 90:

data <- read.table(data.txt, sep = "\t") 

# CREATING LIST OF DATA FRAMES 
dfList <- lapply(seq(ncol(data)), function(s) { 
    W <- wavMODWT(s, wavelet = "s14", n.levels = 4) 

    data.frame(list(d1=as.vector(W$data$d1)), 
       list(d2=as.vector(W$data$d4)), 
       list(d3=as.vector(W$data$d3)), 
       list(d4=as.vector(W$data$d4))) 
}) 

# NAMING EACH ELEMENT IN DF LIST TO CORRESPONDING COLUMN NAME 
dfList <- setNames(dfList, colnames(data)) 

Pour itérer sur les sujets envelopper ci-dessus les affectations dans un autre lapply qui reçoit le 211 distinct ensembles de données sujet en entrée pour générer finalement une liste de 211 dfLists dont chacun a 90 trames de données! L'exemple ci-dessous suppose que les données sont extraites des fichiers texte.

datatxts <- list.files(path="/path/to/folder", pattern=".txt") 

subjectsList <- lapply(datatxts, function(d) { 

    dfList <- lapply(seq(ncol(d)), function(s) { ... }) 
    setNames(dfList, colnames(d)) 
}) 

subjectsList <- setNames(subjectsLists, gsub(".txt", "", datatxts)) 
+0

merci @Parfait – dj20

+0

Je ne sais pas si c'est un merci pour les efforts, ou merci ça a marché. Si cette réponse vous a aidé, veuillez l'accepter (cocher la case à côté) pour confirmer la résolution. – Parfait