2011-11-02 7 views
7

Z DF:Lepszy sposób na uzyskanie tabeli częstotliwości dla danych ciągłych (R)?

df <- data.frame(value=abs(rnorm(100, 25, 5)), status=sample(0:1,100,replace=T)) 
df$value[sample(1:100,5)] <- NA 

muszę dostać (w procentach) Tabela częstotliwości (lepiej powrócić do macierzy) jak następuje:

value | status(0) status(1) 
---------------------------- 
<=25 | 23 (23%) 20 (20%) 
    >25 | 27 (27%) 25 (25%) 
    NA | 3 (3%) 2 (2%) 

mogę to zrobić za pomocą:

br <- seq(0, 50, 25) 
with(df, summary(cut(value[status==0], br, labels=br[-1], 
    include.lowest=T, ordered_result=T))) 
with(df, summary(cut(value[status==1], br, labels=br[-1], 
    include.lowest=T, ordered_result=T))) 

Ale czy byłby jednorazowy sposób na przywrócenie macierzy jak wyżej? Dzięki!

Odpowiedz

11
df$value.cut = cut(df$value, breaks=c(0, 25, 100)) 
> with(df, table(value.cut, status, useNA='ifany')) 
      status 
value.cut 0 1 
    (0,25] 26 19 
    (25,100] 26 24 
    <NA>  3 2 

(oczywiście może to być połączone w 1 linii, jeśli chcesz, ale ja zostawiłem go jako 2 tutaj dla lepszej czytelności.)

EDIT: A jeśli chcesz tabelę rozmiarów sformatowany jako częstotliwościach, można zrobić:

df.tab = with(df, table(value.cut, status, useNA='ifany')) 
df.tab[,] = paste(df.tab, ' (', 100*prop.table(df.tab), '%)', sep='') 
> df.tab 
      status 
value.cut 0  1  
    (0,25] 26 (26%) 19 (19%) 
    (25,100] 26 (26%) 24 (24%) 
    <NA>  3 (3%) 2 (2%) 
+3

A jeśli nie chcesz podawać lewego i prawego punktu obcięcia, ustaw 'breaks = c (-Inf, 25, Inf)'. –

+0

Ładna wskazówka. Zawsze o tym zapominam. –

+0

Dzięki! Powinien lepiej znać tabelę(). :) – Rock

2

Innym rozwiązaniem użyciu reshape2.

library(reshape2) 
dcast(df, cut(value, breaks = c(0, 25, 100)) ~ status) 
+0

dzięki! nauka nowego każdego dnia :) – Rock