2012-06-04 11 views
16

Tengo dos columnas en la trama de datosconteo de frecuencia de dos columnas en I

2010 1 
2010 1 
2010 2 
2010 2 
2010 3 
2011 1 
2011 2 

Quiero contar la frecuencia de ambas columnas y obtener el resultado en este formato

y m Freq 
2010 1 2 
2010 2 2 
2010 3 1 
2011 1 1 
2011 2 1 
+3

seguro de por qué no se le ofreció, pero también se puede hacer simplemente 'as.data.frame (tabla (df))' –

+0

El único problema con esta solución es que hace una tabla cruzada verdadera, que imprime una fila para los 0 también. Esto podría explotar rápidamente si hay muchos valores m que no están compartidos por la mayoría de los valores y. – pyll

Respuesta

19

Si los datos son df trama de datos con columnas y y m

library(plyr) 
counts <- ddply(df, .(df$y, df$m), nrow) 
names(counts) <- c("y", "m", "Freq") 
+1

¿podría convertir esa declaración en SQL para mí? ¡Gracias! –

+3

@DMactheDestroyer lol. Pruebe la etiqueta 'SQL'. – Gregor

+0

@DMactheDestroyer [Ver la respuesta a continuación, usando sqldf] (https://stackoverflow.com/a/10879629). – zx8754

3

Usando sqldf:

sqldf("SELECT y, m, COUNT(*) as Freq 
     FROM table1 
     GROUP BY y, m") 
3

Si tuviera una trama de datos muy grande con muchas columnas o no sabían los nombres de columna de antelación, algo como esto podría ser útil:

library(reshape2) 
df_counts <- melt(table(df)) 
names(df_counts) <- names(df) 
colnames(df_counts)[ncol(df_counts)] <- "count" 
df_counts  

    y m  count 
1 2010 1  2 
2 2011 1  1 
3 2010 2  2 
4 2011 2  1 
5 2010 3  1 
6 2011 3  0 
2
library(data.table) 

oldformat <- data.table(oldformat) ## your orignal data frame 
newformat <- oldformat[,list(Freq=length(m)), by=list(y,m)] 
6

Una más idiomática versión data.table de respuesta de @ uf sería:

library(data.table) # load package 
df <- data.frame(y = c(rep(2010, 5), rep(2011,2)), m = c(1,1,2,2,3,1,2)) # setup data 
dt <- data.table(df) # transpose to data.table 
dt[, list(Freq =.N), by=list(y,m)] # use list to name var directly 
+0

No se trata de correcto o incorrecto. La respuesta es correcta, pero tal vez no tan idiomática. Probablemente debiste proponer una edición en lugar de publicar una respuesta competitiva. –

+0

Hola @DavidArenburg, gracias por los comentarios. Supongo que me entusiasmé con la notación .N en data.table (aunque parece recordar que en ese momento la respuesta de Ugh no parecía funcionar para mí). Tras su sugerencia, edité la respuesta de ugh y la eliminaré, si las modificaciones son aceptadas. También cambié la parte "incorrecta" en mi propia respuesta. – Richard

+0

@DavidArenburg - No debe editar una respuesta para cambiar a una mejor alternativa ([consulte las pautas de revisión del código] (http://meta.stackexchange.com/questions/155538/what-are-the-guidelines-for-reviewing/ 155539 # 155539)). Richard, crear tu propia respuesta fue lo correcto, P. – Scopey

4

no he visto un dplyr respuesta todavía. El código es bastante simple.

library(dplyr) 
rename(count(df, y, m), Freq = n) 
# Source: local data frame [5 x 3] 
# Groups: V1 [?] 
# 
#  y  m Freq 
# (int) (int) (int) 
# 1 2010  1  2 
# 2 2010  2  2 
# 3 2010  3  1 
# 4 2011  1  1 
# 5 2011  2  1 

datos:

df <- structure(list(y = c(2010L, 2010L, 2010L, 2010L, 2010L, 2011L, 
2011L), m = c(1L, 1L, 2L, 2L, 3L, 1L, 2L)), .Names = c("y", "m" 
), class = "data.frame", row.names = c(NA, -7L)) 
No
Cuestiones relacionadas