2011-09-11 9 views
5

Ho un frame di dati a 2 colonne di coordinate X e Y di punti. Voglio generare una tabella del numero di occorrenze di ogni punto. L'utilizzo del comando table() produce una tabella per tutte le possibili coppie x-y. Sono in grado di eliminare gli extra conTabella di aggregazione() su più colonne in R senza una ripartizione "per"

fullTable <- table(coords) 
smalLTable <- subset(fullTable, fullTable > 0) 

E poi sono sicuro che avrei potuto fare un po 'di qualcosa con dimnames(fullTable) per ottenere le coordinate appropriate, ma c'è un modo migliore? Qualcosa di costruito? Qualcosa che, con

coords <- data.frame(x = c(1, 1, 2, 2, 3, 3), y = c(1, 1, 2, 1, 1, 1)) 

sarebbero tornati

x y count 
1 1 2 
2 1 1 
2 2 1 
3 1 2 

risposta

9

Usando solo Vanilla R, si può fare

aggregate(rep(1, nrow(coords)), by = list(x = coords$x, y = coords$y), sum) 
+0

Esattamente quello che ho stavo cercando. Grazie! – Gregor

+1

'coords' è un data.frame (che è già una lista), quindi una soluzione leggermente più corta sarebbe:' aggregare (coorda $ x, per = coorde, lunghezza) '. –

4

È possibile utilizzare ddply dalla libreria plyr

plyr::ddply(coords, .(x, y), summarize, count = length(x)) 
7

B Etter di ddply IS count:

library(plyr) 
count(coords) 

E 'molto più veloce di tavolo per i risultati 2d sparse troppo.

4

Si potrebbe anche usare data.table

library(data.table) 
DT <- data.table(coords) 
DT[,.N,by=list(x,y)] 
## x y N 
## 1: 1 1 2 
## 2: 2 2 1 
## 3: 2 1 1 
## 4: 3 1 2 

Vedere this answer per maggiori dettagli sull'uso di .N e tabelle di frequenza creando con data.table

1

Aggiunta di un metodo dplyr:

library(dplyr) 
group_by(coords, x, y) %>% 
    summarize(count = n()) 
Problemi correlati