Question

Je voudrais travailler avec des combinaisons uniques de var1 et var2 dans mon dataframe:

foo <- data.frame(var1 = c(1,1,2,2,2,2,3,3,3,3,3,4,4,4,4),
                  var2 = c(1,1,1,1,2,2,1,1,2,2,2,2,2,3,3))

Comme il a été noté, les résultats de unique(foo) dans ceci:

      var1  var2
 1    1     1
 2    2     1
 3    2     2
 4    3     1
 5    3     2
 6    4     2
 7    4     3

Sur la base des combinaisons uniques, comment puis-je:

  • n, le nombre d'occurrences d'une valeur de var1 et
  • svar, la somme des valeurs var1 de chaque valeur var2.

La sortie pourrait ressembler à ceci:

      var1  n    svar
1     1     1    1
2     2     2    3
3     3     2    3
4     4     2    5
Était-ce utile?

La solution

unique(foo) devrait vous donner ce que vous recherchez ici.

Mise à jour 2014: l'utilisation dplyr au lieu de plyr

Je recommande la recherche dans la bibliothèque plyr pour d'autres tâches de type d'agrégation, ou les équivalents de base R des tapply(), aggregate() et al.

Bien que redondant pour cet exercice, voici comment vous utiliseriez plyr:

library(plyr)
ddply(foo, .(var1), unique)

Notez que vous pouvez remplacer unique avec un certain nombre de fonctions, telles que trouver la moyenne et sd de var2 comme ceci:

ddply(foo, .(var1), summarise, mean = mean(var2), sd = sd(var2))

Réponse à modifier

Maintenant, vous avez une utilisation plus légitime pour plyr(). Prendre ce que nous avons appris ci-dessus:

x <- unique(foo)

combiné avec plyr:

ddply(x, .(var1), summarise, n = length(var2), sum = sum(var2))

Si vous donner ce que vous recherchez.

Autres conseils

J'espère que je comprends bien votre question, essayez:

unique(foo)

Une fois question a été modifiée:

Pour ne pas écrire la même chose que @Chase, une solution très simple mais pas trop élégante pourrait être:

foo$var12 <- paste(foo$var1, foo$var2, sep='|')      # the two variables combined to one
table(foo$var12)                                     # and showing its frequencies

Et la sortie est une table bien sûr:

 1|1 2|1 2|2 3|1 3|2 4|2 4|3 
   2   2   2   2   3   2   2 

Les réponses sont différentes que vous dites, mais je fais confiance à mon code plus que ce que je fais confiance à votre réponse, et je ne peux pas me résoudre à commettre le péché de nommer une variable « somme »:

 newfoo <- data.frame(
                 var1=unique(foo$var1),
                 n = with(foo, tapply(var2, var1, length) ),
                 svar = with(foo, tapply(var2, var1, sum) ) )
 newfoo
#  var1 n svar
#1    1 2    2
#2    2 4    6
#3    3 5    8
#4    4 4   10

EDIT: (. Avait pas d'abord compris ce que Chase ne essayer de me dire)

newfoo <- data.frame(
                  var1=unique(unique(foo)$var1),
                  n = with(unique(foo), tapply(var2, var1, length) ),
                  svar = with(unique(foo), tapply(var2, var1, sum) ) )

> newfoo
  var1 n svar
1    1 1    1
2    2 2    3
3    3 2    3
4    4 2    5
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top