Somme par colonne distincte de la valeur dans R
J'ai une très grande dataframe dans R et tiens à la somme des deux colonnes pour chaque valeur distincte dans les autres colonnes, par exemple de dire que nous avions des données d'un dataframe de transactions dans divers magasins au cours d'une journée comme suit
shop <- data.frame('shop_id' = c(1, 1, 1, 2, 3, 3),
'shop_name' = c('Shop A', 'Shop A', 'Shop A', 'Shop B', 'Shop C', 'Shop C'),
'city' = c('London', 'London', 'London', 'Cardiff', 'Dublin', 'Dublin'),
'sale' = c(12, 5, 9, 15, 10, 18),
'profit' = c(3, 1, 3, 6, 5, 9))
qui est:
shop_id shop_name city sale profit
1 Shop A London 12 3
1 Shop A London 5 1
1 Shop A London 9 3
2 Shop B Cardiff 15 6
3 Shop C Dublin 10 5
3 Shop C Dublin 18 9
Et je veux pas faire le total de la vente et de profit pour chaque boutique pour donner:
shop_id shop_name city sale profit
1 Shop A London 26 7
2 Shop B Cardiff 15 6
3 Shop C Dublin 28 14
Je suis actuellement en utilisant le code suivant pour ce faire:
shop_day <-ddply(shop, "shop_id", transform, sale=sum(sale), profit=sum(profit))
shop_day <- subset(shop_day, !duplicated(shop_id))
qui fonctionne tout à fait bien, mais comme je l'ai dit mon dataframe est large (de 140 000 lignes, 37 colonnes et près de 100 000 lignes uniques qui je veux somme) et mon code prend une éternité à courir et puis finalement dit qu'il est à court de mémoire.
Personne ne sait de la manière la plus efficace pour ce faire.
Merci d'avance!
data.table
réponse à venir...
OriginalL'auteur user1165199 | 2012-08-02
Vous devez vous connecter pour publier un commentaire.
** Données obligatoires Table de réponse **
Qui sonne très bien jusqu'à ce que les choses deviennent de plus...
Vous obtenez plus la vitesse augmente si vous créez les données.table avec une clé:
summarise
au lieutransform
dans sonddply
d'appel; que le changement est probablement suffisant pour obtenir votre code de travail sans erreur de mémoire, mais d'autres solutions sont certainement plus rapide.Merci! J'ai quitté cette explication car il y avait un précédent réponse que l'a expliqué. Mais qui a été depuis supprimé!
Merci Justin, beaucoup plus rapide. Une autre petite question, est-il un moyen de garder les autres colonnes (par exemple, shop_name, ville) dans le final de la table de données? Je peux me joindre en arrière sur la première dataframe pour obtenir cela, mais serait plus lisible si il y avait un moyen de faire cela dans la requête initiale.
Aussi est-il frapper les effets d'avoir mon bloc de données désormais stockées en tant que données de la table plus tard? est-il effectuer différemment pour certaines requêtes? Merci
Il peut y avoir quelques surprises plus tard, mais vous pouvez toujours utiliser
as.data.frame
pour déplacer les données de la table d'attribut. Aussi loin que la conservation des colonnes d'origine, bien sûr. vous pouvez fusionner ou de les ajouter à lalist()
avecunique(shop_name)
. jetez un oeil à?merge.data.table
pour plus d'informations sur la fusion.OriginalL'auteur Justin
Voici comment utiliser la base de R pour accélérer les opérations de ce genre:
Temps réduit à 0,75 sec vs 5.70 sec pour l'ddply résumer version sur mon système.
Pas vraiment à l'aide de cette méthode exacte, mais il y a des façons de le faire. Démarrer une nouvelle question avec un peu reproductible exemple, et vous obtiendrez beaucoup de suggestion.
OriginalL'auteur Aaron
Je pense que la plus élégante façon de le faire est en
dplyr
OriginalL'auteur user1165199
Juste au cas où, si vous avez une longue liste de colonnes,
utilisation summarize_if()
Résume toutes les colonnes si le type de données est de type int
OriginalL'auteur Abhishek