2017-12-12 4 views
1

Ich habe einen Datenrahmen mit ein paar Zeichen Spalten und eine Datumsspalte und eine Zeichenfolge Spalte.Wie filtere ich die Ergebnisse in Tabelle()

Eine der Spalten ist eine Liste von Städten und ich würde gerne wissen, welche Städte in meinem Datensatz am häufigsten auftauchen. Ich benutzte table(dataframe$city), aber es gab mir eine Liste von jeder Stadt (einschließlich Städte, die nur ein- oder zweimal auftauchen).

Wie filtere ich die Ergebnisse meiner Stadt, um nur die Städte im obersten Quartil zu zeigen, basierend auf der Häufigkeit, mit der sie in den Daten erscheinen?

hier Beispiel Eingabe:

id price city 
1 $0.8 los angeles 
2 $0.8 new york 
3 $0.5 new york 
4 $0.6 new york 
5 $0.9 los angeles 
6 $0.1 houston 
7 $0.7 chicago 
8 $0.8 new york 
9 $0.7 new york 
10 $0.0 new york 
11 $0.5 new york 
12 $0.1 new york 
13 $0.9 new york 
14 $0.3 los angeles 
15 $0.9 los angeles 
16 $0.9 los angeles 
17 $0.8 los angeles 
18 $0.5 miami 
19 $0.9 boston 
20 $1.0 newton 
21 $0.2 san mateo 
22 $0.3 milbrae 

Als ich table(dataframe$city) tun, ich eine Liste von jeder Stadt erhalten und zählen, wie oft es erscheint. Was, wenn ich nur eine Liste der Städte haben möchte, die überdurchschnittlich erscheinen (wie New York und Los Angeles)?

+4

Es ist einfacher, Ihnen zu helfen, wenn Sie ein Beispiel [reproducable] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) mit Beispieleingabe und die gewünschte Ausgabe. – MrFlick

+0

Speichern Sie einfach Ihre Ergebnisse Tabelle() in ein Objekt und sortieren Sie es. Mit Soja kann man es mit df sortieren [order (variable_to_be_sorted),] –

Antwort

2

Für ein Faktor, Tabelle wird ein Array (ähnlich einem Vektor) zurückzukehren. Um es also "zu filtern", müssen Sie es mit den von Ihnen angegebenen Bedingungen unterteilen.

tbl <- table(dataframe$city) 
quants <- quantile(tbl) 

tbl[tbl >= quants['75%']] 

Edit:

OP geändert, um die Anforderung von obersten Quartil zu 'überdurchschnittlich'. Das ist noch einfacher:

tbl <- table(dataframe$city) 
tbl[tbl >= mean(tbl)] 
+0

Sie haben Recht, mein Fehler. Kommentar gelöscht. –

1

Diese Versuchen:

tab = table(dataframe$city) 
# sort it 
(sort_tab = sort(tab, decreasing = T)) 
# take only the top quarter 
head(sort_tab, length(sort_tab)/4) 
+0

Könnte ein Problem mit Bindungen (in Bezug auf Frequenzen) haben? – AntoniosK

+1

Ja, das ist definitiv eine "schnelle und schmutzige" Lösung. Wirklich nur demonstrieren, wie weit Sie mit sehr einfachen Befehlen kommen können. – Gregor

2

Hier ein Beispiel ist können Sie laufen:

dat <- sample(1:10, size = 200, replace = TRUE) 

dat_table <- table(dat) 

dat_table[dat_table >= quantile(dat_table, probs = 0.75)] 
1

Eine dplyr Option Dummy-Daten ...


library(tidyverse) 
#> ── Attaching packages ──────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ── 
#> ✔ ggplot2 2.2.1  ✔ purrr 0.2.4 
#> ✔ tibble 1.3.4  ✔ dplyr 0.7.4 
#> ✔ tidyr 0.7.2  ✔ stringr 1.2.0 
#> ✔ readr 1.1.1  ✔ forcats 0.2.0 
#> Warning: package 'tidyr' was built under R version 3.4.2 
#> Warning: package 'purrr' was built under R version 3.4.2 
#> Warning: package 'dplyr' was built under R version 3.4.2 
#> ── Conflicts ─────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ── 
#> ✖ dplyr::filter() masks stats::filter() 
#> ✖ dplyr::lag() masks stats::lag() 

city_data <- tibble(city = c("LA", "DC", "DC", "LA", "CL", "DC", "NY"), A = sample(1:10, 7), B = sample(1:10, 7)) 

city_data %>% 
    count(city) %>% 
    filter(., n> nrow(.)/4) 
#> # A tibble: 2 x 2 
#> city  n 
#> <chr> <int> 
#> 1 DC  3 
#> 2 LA  2 
1

Noch ein weiteres Beispiel :

# some example data... pretend letters are cities 
dat <- sample(letters,250,replace=T) 

# take the full table 
tab <- table(dat) 

# Here's my inelegant solution: 
ord <- sort(tab/sum(tab),decreasing=T) 
len <- length(tab) 
top25.percentile <- floor(len/4) 
show.nms <- names(ord[1:top25.percentile]) 
tab[which(names(tab) %in% show.nms)] 
Verwandte Themen