2013-01-21 5 views
0

Je suis un débutant à la programmation R (en l'utilisant pour l'analyse de données)Fonction R retournant la trame de données (colonne supplémentaire)

J'ai les données suivantes. (version rognée)

state storeid sales 
CA 1 40,000 
CA 2 44,000 
CA 3 38000 
MN 1 26000 
MN 2 25500 

J'ai besoin d'une fonction qui retourne les mémoires les plus performantes/les moins performantes.

J'ai écrit la fonction suivante.

storeinfo<-function(num="top") { 

    df<-read.csv("store.csv") 

    bestVal <- 1; 
    if (!missing(num)) { 
    if(is.numeric(num)){ 
     bestVal = as.numeric(num); 
    } 
    if(num=="top"){ 
     bestVal <-1 
    } 
    if (num=="poor"){ 
     bestVal<-0 
    } 
    } 
    print(bestVal) 
    data2<-subset(df[,c(1,2,3)]) 
    data2<-data2[order(as.numeric(data2$sales), data2$storeid,na.last=TRUE,decreasing=TRUE), ] 
    idx<-tapply(1:NROW(data2),data2$state,"[",bestVal) 
    idx1<-tapply(1:NROW(data2),data2$state,"[",1) 

    return (data.frame(data2[idx1,1],data2[idx,2:3])) 

} 

quand j'exécute la fonction ci-dessus, je vois ce qui suit

> head(storeinfo(1)) 
[1] 1 
    data2.idx1..1. storeid sales 
2    CA  2 44,000 
4    MN  1 26000 

a) Comment supprimer la première colonne 2,4 etc? (Index) b) Comment trouver les magasins dont les ventes sont faibles? c) Comment définir différents noms de colonne pour la trame de données renvoyée.

+0

La première colonne est pas; Ce sont les noms de ligne de votre nom de fichier. Vous pouvez faire 'rownames (yourobject) <- NULL' si vous voulez les remplacer par 1, 2, 3, etc. Vous pouvez également changer les noms des colonnes en utilisant' colnames (yourobject) <- c ("state", "storeid "," ventes ")'. Le reste est trop confus pour moi. En particulier, vous n'avez pas défini ce que vous entendez par "magasin" en ce qui concerne "state" et "storeid". – flodel

+0

retdf <-data.frame (données2 [idx1,1], données2 [idx, 2: 3]) retdf.rownames <-NULL Après cela, je vois des noms de lignes dans la sortie. – satya

+0

retdf <-data.frame (données2 [idx1,1], données2 [idx, 2: 3], row.names = NULL) return (retdf) Cependant, je vois des noms de lignes dans la sortie. – satya

Répondre

0

Est-ce que ce

min_max_sales = c(which.min(df$sales), which.max(df$sales)) # return row numbers 
df[min_max_sales,] 

UPDATE.

Si vous devez trier la trame de données et obtenir un magasin avec les nième meilleures ventes, voici une meilleure approche en utilisant le paquet plyr

plyr::arrange(df, sales)[n,] 
+0

Je vais essayer. J'ai besoin de trouver, 2ed meilleur, 3ed meilleurs magasins etc. C'est la raison, je passais "num" param pour fonctionner. – satya

+0

avez-vous juste besoin de trier par ventes? Dans ce cas, vous pouvez installer le paquet 'plyr' et faire' arrange (df, sales) '. Cela vous donnera un dataframe trié par ventes et vous pourrez extraire les 1er, 2ème ou 3ème meilleurs magasins. – Ramnath

Questions connexes