J'ai une image de données comme celle ci-dessous, mais avec beaucoup plus de lignes de Je peux penser à des moyens élaborés et sales de le faire, mais je cherche quelque chose de court et efficace. Merci p> p> df code> je veux un cadre de données où les rangées sont l'unique Valeurs de df $ x2 code> et col1 est la proportion de 1s associée à chaque lettre et COL2 est le nombre de pièces de chaque lettre. Donc, ma sortie serait p>
5 Réponses :
Essayez d'installer Plyr et d'exécuter
do.call(rbind, lapply(split(df, df$x2),
with, list(prop = mean(x1),
count = length(x1))))
Je ne pense pas que cela soit correct. Il a besoin de proportion. C'est différent de la moyenne par groupe.
@Arun, je pense que je suis en désaccord. OP regarde la proportion de 1 code> au sein de chaque groupe, donc moyenne code> est approprié. Voir que cela donne la production attendue de l'OP.
Si les valeurs de x1 sont toujours en {0, 1}, moyenne (x1) devrait être ce qu'il veut. Sinon, il peut faire la moyenne (x1 == 1)
J'aurais pu juré que j'ai vu le résultat de la réponse antérieure de Mark est la même que celle de l'OP. (-1) retourné.
Je ne suis pas sûr que cela fait ce que vous voulez.
agrégat (x1 ~ x2, df, fonction (x) c (prop = moyen (x), compte = longueur (x))) code>
Essayez d'utiliser Table CODE> data.frame(proportions=tbl["1",] / colSums(tbl))
proportions
a 0.6666667
b 0.0000000
c 0.5000000
J'aime @ la solution de Ricardosaporta (+1), mais vous pouvez utiliser ? Prop.table aussi:
getprops <- function(values, indicator){
tab <- table(values, indicator)
ptab <- prop.table(tab, margin=1)
dframe <- data.frame(values=rownames(tab), prop=ptab[,2], count=tab[,2])
return(dframe)
}
> getprops(values=df$x2, indicator=df$x2)
values prop count
a a 0.6666667 2
b b 0.0000000 0
c c 0.5000000 1
Voici une doublure dans data.Table code>:
où dt <- data.table (df) code> em> p> p> p>