2011-09-11 18 views
5

Tengo un marco de datos de 2 columnas de coordenadas x e y de puntos. Quiero generar una tabla del número de ocurrencias de cada punto. El uso del comando table() produce una tabla para todos los posibles pares x-y. Puedo eliminar los extras conTabla de agregación() sobre múltiples columnas en R sin un desglose "por"

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

Y entonces estoy seguro de que podría hacer un poco de algo con dimnames(fullTable) para obtener las coordenadas adecuadas, pero hay una manera mejor? Algo incorporado? Algo que con

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

volvería

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

Respuesta

9

Utilizando sólo Vanilla R, se puede hacer

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

Exactamente lo que estaba buscando. ¡Gracias! – Gregor

+1

'coords' es un data.frame (que ya es una lista), por lo que una solución un poco más corta sería:' aggregate (coords $ x, by = coords, length) '. –

4

Usted puede utilizar ddply de la biblioteca plyr

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

B Etter que ddply es count:

library(plyr) 
count(coords) 

Es mucho más rápido que la tabla de resultados 2D dispersos también.

4

También es posible usar 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 

Ver this answer para más detalles sobre el uso de .N y la creación de tablas de frecuencia con data.table

1

Adición de un método dplyr:

library(dplyr) 
group_by(coords, x, y) %>% 
    summarize(count = n()) 
Cuestiones relacionadas