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 valore var1 e
  • svar, la somma dei valori var1 di ogni valore var2.

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
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top