9
votes

Calcul des sous-totaux en r

J'ai une trame de données avec 900 000 lignes et 11 colonnes dans R. Les noms et types de colonnes sont les suivants: xxx

Je veux calculer les sous-totaux. Par exemple, je veux calculer les sommes à chaque modification de YName et ajouter sous-total à toutes les variables numériques. Il y a 160 Ynames distincts, la table résultante devrait-elle me dire le sous-total de chaque numéro YName. Je n'ai pas encore trié les données, mais ce n'est pas un problème car je peux trier les données de la manière dont je veux. Vous trouverez ci-dessous un extrait de mes données: xxx

Quelle fonction dois-je utiliser ici? Peut-être quelque chose comme SQL groupe par ?


3 commentaires

Ce serait beaucoup plus facile si vous nous avez donné un extrait de données ou plus de détails sur ce que vous voulez réellement. Il y a un degré d'ironie dans votre demande d'exemples de nous lorsque vous ne vous fournissez pas vous-même! Sérieusement, il est fort probable que la plupart des Gurus n'utiliseront pas Excel et ne l'ont probablement pas fait, alors ne présumez pas que nous savons ce que vous voulez dire quand vous dites "le faire comme Excel". Est yname trié? Parce que ce serait une tâche d'agrégation dans R (c'est-à-dire que vous souhaitez que les sommes numériques des groupes définis par YName).


@Gavin Simpson: J'ai mis à jour ma question conformément à votre commentaire.


Voici quelques questions connexes: Stackoverflow.com/search?q=%5BR%5D+%22Group etc. par% 22


7 Réponses :


2
votes

Vous pouvez utiliser agrégat code>

par exemple, indiquer que vous avez p> xxx pré>

alors vous pouvez faire p>

aggregate(data$val, by=list(data$name), FUN=sum)


0 commentaires

4
votes

ou la bibliothèque plyr , qui est facilement extensible à d'autres classes de données: xxx


0 commentaires

10
votes

OK. En supposant que vos données soient dans une trame de données nommée foo code>: xxx pré>

alors cela fera l'agrégation des colonnes numériques dans vos données: p>

> aggregate(cbind(bsent, breturn, tsent, treturn, csales) ~ yname, data = foo, 
+           FUN = sum, na.rm = TRUE)


0 commentaires

4
votes

Vous pouvez également utiliser xtabs ou tapply : xxx


0 commentaires

2
votes

Il y a un package R appelé SQLDF qui vous permet d'utiliser des commandes SQL sur RATS.Fammes. En plus, comme vous l'avez déjà dit, le groupe par serait bien. Vous pouvez facilement stocker vos données dans une base de données MySQL locale et connecter à R à l'aide du package RMYSQL (vous pouvez également utiliser la plupart des autres SGMS aussi, mais MySQL est le plus facile à configurer).

Autant que je puisse le juger, SLYR est un excellent forfait. Mais de la façon dont vous demandez et comparez votre problème à regrouper, je suppose que vous savez quelque chose à propos de SQL, alors en utilisant cela pourrait être plus facile pour vous. Il existe des fonctions confortables telles que DBreadTable, plus si vos données deviennent plus grandes, vous ne pouvez sélectionner que les sous-parties de vos données pour exécuter votre analyse avec ce dont vous avez vraiment besoin.


0 commentaires

4
votes

Si vos données sont importantes et que vous recommandez d'utiliser la fonction Rowsum R, qui est beaucoup plus rapide. J'ai appliqué les 3 méthodes (F1 = agrégat, F2 = DDPLY, F3 = TAPPLY) suggérée dans les réponses à la comparer avec F4 = Rowsum et voici ce que je trouve:

library(plyr);
library(rbenchmark);

val  = rnorm(50);
name = rep(letters[1:5], each = 10);
data = data.frame(val, name);

f1 = function(){aggregate(data$val, by=list(data$name), FUN=sum)}
f2 = function(){ddply(data, .(name), summarise, sum = sum(val))}
f3 = function(){tapply(data$val, data$name, sum)}
f4 = function(){rowsum(x = data$val, group = data$name)}

benchmark(f1(), f2(), f3(), f4(),
          columns=c("test", "replications", "elapsed", "relative"),
          order="relative", replications=100)


0 commentaires

3
votes

Google n'était pas très utile lorsque j'ai essayé de trouver une réponse à une question similaire. Je pensais que je partagerais ma solution ci-dessous à l'aide du package Bibliothèque avec Split () et Purrr :: map_df () .

Mon cas d'utilisation consistait à exécuter un script qui saisirait des dépenses CC de nombreuses personnes différentes à examiner par une personne. xxx


0 commentaires