Calcolare combinazioni uniche di valori in dataframe, e valori di riepilogo
-
11-10-2019 - |
Domanda
Mi piacerebbe lavorare con combinazioni uniche di var1
e var2
nella mia 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))
Come è stato notato, risultati unique(foo)
in questo:
var1 var2
1 1 1
2 2 1
3 2 2
4 3 1
5 3 2
6 4 2
7 4 3
In base alle combinazioni uniche, come faccio a:
-
n
, il numero di occorrenze di un valorevar1
e -
svar
, la somma dei valorivar1
di ogni valorevar2
.
L'output potrebbe assomigliare a questo:
var1 n svar
1 1 1 1
2 2 2 3
3 3 2 3
4 4 2 5
Soluzione
unique(foo)
dovrebbe darvi che cosa siete dopo qui.
UPDATE 2014: uso dplyr
invece di plyr
vi consiglio esaminando la plyr
libreria per altri compiti di tipo aggregante, o gli equivalenti di base R di tapply()
, aggregate()
et al.
Mentre ridondante per questo esercizio, ecco come si usa plyr:
library(plyr)
ddply(foo, .(var1), unique)
Si noti è possibile sostituire unico, con qualsiasi numero di funzioni, come trovare la media e la deviazione standard di var2 in questo modo:
ddply(foo, .(var1), summarise, mean = mean(var2), sd = sd(var2))
Risposta a modifica
Ora avete un uso più legittimo plyr()
. Facendo quello che abbiamo imparato da sopra:
x <- unique(foo)
in combinazione con plyr:
ddply(x, .(var1), summarise, n = length(var2), sum = sum(var2))
dovrebbe darvi che cosa siete dopo.
Altri suggerimenti
spero ho capito bene la tua domanda, prova a:
unique(foo)
Dopo questione è stato modificato:
Per non scrivere lo stesso di @Chase, molto semplice, ma non troppo elegante soluzione potrebbe essere:
foo$var12 <- paste(foo$var1, foo$var2, sep='|') # the two variables combined to one
table(foo$var12) # and showing its frequencies
E l'uscita è una tabella di corso:
1|1 2|1 2|2 3|1 3|2 4|2 4|3
2 2 2 2 3 2 2
Le risposte sono diverse da quelle che si stato, ma confido il mio codice più di quanto mi fido la tua risposta, e non mi può portare a commettere il peccato di nominare una variabile "somma":
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: (. Non era in un primo momento capito cosa Chase ha provate a dirmi)
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