我有一个包含几个字符列的数据框,一个日期列和一个字符串列。
其中一列是城市列表,我想知道哪些城市在我的数据集中显示最多。我使用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
当我table(dataframe$city)
时,我会得到每个城市的列表以及它出现次数的计数。如果我只想要一个看起来超过平均水平的城市列表(如纽约和洛杉矶)怎么办?
答案 0 :(得分:2)
对于一个因子,table将返回一个数组(类似于向量)。所以为了过滤'它,您需要使用您指定的任何条件对其进行子集化。
tbl <- table(dataframe$city)
quants <- quantile(tbl)
tbl[tbl >= quants['75%']]
编辑:
OP将请求从最高四分位数更改为高于平均水平的&#39;。这更简单:
tbl <- table(dataframe$city)
tbl[tbl >= mean(tbl)]
答案 1 :(得分:2)
以下是您可以运行的示例:
dat <- sample(1:10, size = 200, replace = TRUE)
dat_table <- table(dat)
dat_table[dat_table >= quantile(dat_table, probs = 0.75 )]
答案 2 :(得分: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)
答案 3 :(得分: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
答案 4 :(得分: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)]