2011-09-08 4 views
3

J'ai une trame nommée commodities_3. Il contient 28 colonnes avec différentes marchandises et 403 lignes représentant les données de fin de mois. Ce que je besoin est de trouver la position de chaque ligne séparément:Tri et recherche de valeurs dans d'autres trames de données

  • valeur maximale,
  • valeur
  • min,
  • tous les autres points positifs
  • tous les autres négatifs

Les index doivent alors être utilisé pour localiser les données correspondantes dans une autre base de données avec les mêmes caractéristiques de colonne et de ligne appelées commodities_3_returns. Ces données doivent ensuite être copiées dans 4 nouvelles bases de données (une trame de données pour chaque tri).

Je sais comment trouver les positions des valeurs pour chaque ligne en utilisant quelle et quelle.min et quelle.max. Mais je ne sais pas comment mettre cela en boucle pour le faire pour toutes les 403 lignes. Et par la suite, comment utiliser ces données pour localiser les données correspondantes dans l'autre image commodities_3_returns.


Unfortunaltey Je dois utiliser un dataframe parce que j'ai les dates que rownames là-dedans, que je dois garder comme je l'ai besoin plus tard pour l'indexation, ainsi que NA de. Il ressemble à ceci:

commodities_3 <- as.data.frame(matrix(rnorm(15), nrow=5, ncol=3)) 
mydates <- as.Date(c("2011-01-01", "2011-01-02", "2011-01-03", "2011-01-04", "2011-01-05")) 
rownames(commodities_3) <- mydates 
commodities_3[3,2] <- NA 


commodities_3_returns <- as.data.frame(matrix(rnorm(15), nrow=5, ncol=3)) 
mydates <- as.Date(c("2011-01-01", "2011-01-02", "2011-01-03", "2011-01-04", "2011-01-05")) 
rownames(commodities_3_returns) <- mydates 
commodities_3_returns[3,3] <- NA 

Comme je l'ai dit, j'ai au total 403 lignes et 27 colonnes. Dans chaque rangée, il y a des NA que je dois garder aussi. max.col ne semble pas être capable de gérer les NA.

Ma sortie souhaitée pour l'exemple mentionné ci-dessus serait STH comme ceci:

max_values <- as.data.frame(matrix(data=c(1:5,3,2,1,3,1), nrow=5, ncol=2, byrow=F)) 
+0

Vous pourriez commencer par nous donner un exemple reproductible. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example Cela nous aiderait aussi si vous nous montriez comment la sortie devrait ressembler. –

+0

J'ai fusionné votre compte non enregistré dans votre compte enregistré. Vous avez maintenant un contrôle total sur cette question. –

Répondre

2

Si toutes les colonnes commodities_3 sont numériques, alors vous voulez une matrice, et non pas une trame de données. Ensuite, utilisez la fonction apply. Quelques exemples de données, pour reproducubilité.

commodities_3 <- matrix(rnorm(12), nrow = 4) 
commodities_3_returns <- matrix(1:12, nrow = 4) 

Les statistiques.

mins <- apply(commodities_3, 1, which.min) 
maxs <- apply(commodities_3, 1, which.min) 
pos <- apply(commodities_3, 1, function(x) which(x > 0)) #which is optional 
neg <- apply(commodities_3, 1, function(x) which(x < 0)) 

utilisent maintenant ceux-ci dans l'index pour commodities_3_returns. En l'absence de café, mon cerveau n'a qu'une solution avec une clunky boucle

n_months <- nrow(commodities_3_returns) 
min_returns <- numeric(n_months) 
for(i in seq_len(n_months)) 
{ 
    min_returns[i] <- commodities_3_returns[i, mins[i]] 
} 
1

Voici une autre approche pour obtenir le min et max à l'aide max.col qui est une fonction interne C. Si vous avez un grand nombre de données, max.col travaux extrêmement rapide par rapport aux solutions basées apply

mins = max.col(-commodities_3) 
maxs = max.col(commodities_3) 
N = NROW(commodities_3) 

commodities_3_returns[cbind(1:N, mins)] # returns min 
commodities_3_returns[cbind(1:N, maxs)] # returns max 
Questions connexes