Calculer des combinaisons uniques de valeurs dans dataframe et les valeurs de synthèse
-
11-10-2019 - |
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 devar1
et -
svar
, la somme des valeursvar1
de chaque valeurvar2
.
La sortie pourrait ressembler à ceci:
var1 n svar
1 1 1 1
2 2 2 3
3 3 2 3
4 4 2 5
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