2017-12-12 3 views
1

私はいくつかの文字列と日付列と文字列を持つデータフレームを持っています。テーブル内の結果をフィルタリングするには

列の1つに都市のリストがあり、どの都市が自分のデータセットで最も多く表示されているかを知りたいと思います。私はtable(dataframe$city)を使用しましたが、すべての都市のリスト(ちょうど1,2回現れる都市を含む)を私に渡しました。

データに表示された回数に基づいて、上位四分位の都市のみを表示するには、都市の結果をフィルタリングするにはどうすればよいですか?私はtable(dataframe$city)を行うと、私はすべての都市のリストと、それが表示された回数のカウントを取得

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 

は、ここでは例として入力です。平均以上の都市(ニューヨークやロサンゼルスのような都市)のリストがほしいのであればどうでしょうか?

+4

[再生可能な例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)にサンプル入力と所望の出力。 – MrFlick

+0

table()の結果をオブジェクトに保存して並べ替えるだけです。 ベースでは、ダイズはdf [order(variale_to_be_sorted)]でソートできます –

答えて

2

一つの要因のために、テーブルが(ベクトルに類似)の配列を返します。だから、それを 'フィルタリング'するには、あなたが指定したどんな条件でもサブセット化する必要があります。

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

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

編集:

OP 'が平均上記' に上部四分位からの要求を変更しました。それはさらに簡単です:ここで

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

あなたは正しい、私の間違い。コメントは削除されました。 –

1

これを試してください:

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

(頻度に関して)ネクタイに問題がありますか? – AntoniosK

+1

はい、これは間違いなく「迅速で汚れた」解決策です。非常に基本的なコマンドでどのくらい手に入れることができるかを実証するだけです。 – Gregor

2

は、あなたが実行することができます例です:

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

dat_table <- table(dat) 

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

ダミーデータを使用してdplyrオプション...


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

さらに別の例:

# 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)] 
関連する問題