2012-06-04 11 views
16

Mam dwie kolumny w ramce danychIlość Częstotliwość dwie kolumny w R

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

Chcę policzyć częstotliwość obu kolumnach i uzyskać wynik w tym formacie

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

Nie wiem, dlaczego nie było oferowane, ale można też po prostu zrobić 'as.data.frame (tabela (DF))' –

+0

Jedyny problem z to rozwiązanie polega na tym, że tworzy prawdziwą tabelę przestawną, która również wypisuje wiersz dla zer. Może to szybko wybuchnąć, jeśli istnieje wiele m wartości, które nie są wspólne dla większości wartości y. – pyll

Odpowiedz

19

Jeśli twoje dane to ramka danych df z kolumnami y i m

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

czy mógłbyś przekonwertować tę instrukcję na SQL? dzięki! –

+3

@DMactheDestroyer lol. Wypróbuj znacznik 'SQL'. – Gregor

+0

@DMactheDestroyer [Zobacz poniżej odpowiedź, używając sqldf] (https://stackoverflow.com/a/10879629). – zx8754

3

Korzystanie sqldf:

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

Jeśli miał bardzo duże ramki danych z wielu kolumn lub nie znać nazwy kolumn z góry, coś w tym może być użyteczna:

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

Bardziej idiomatyczne data.table wersja odpowiedzi @ ugh byłoby:

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

Nie chodzi o poprawność lub niepoprawność. Odpowiedź jest poprawna, ale może nie tak idiomatyczna. Prawdopodobnie powinieneś po prostu zaproponować edycję zamiast opublikować konkurencyjną odpowiedź. –

+0

Witam przy pomocy @DavidArenburg. Sądzę, że byłem bardzo podekscytowany notowaniem .N w data.table (choć wydaje mi się, że pamiętam, że w tym czasie odpowiedź Ugha nie wydawała mi się odpowiednia). Po twojej sugestii zredagowałem odpowiedź Ugh i usunę tę, jeśli zmiany zostaną zaakceptowane. Zmieniłem także "niepoprawną" część w mojej własnej odpowiedzi. – Richard

+0

@DavidArenburg - Nie należy edytować odpowiedzi, aby zmienić na lepszą alternatywę ([patrz wskazówki dotyczące przeglądu kodu] (http://meta.stackexchange.com/questions/155538/what-are-the-guidelines-for-reviewing/ 155539 # 155539)). Richard, tworzenie własnej odpowiedzi było właściwe, P. – Scopey

4

ja nie widziałem dplyr odpowiedź jeszcze. Kod jest raczej prosty.

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 

danych:

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))