如何过滤表格中的结果()

时间:2017-12-12 17:11:42

标签: r

我有一个包含几个字符列的数据框,一个日期列和一个字符串列。

其中一列是城市列表,我想知道哪些城市在我的数据集中显示最多。我使用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)时,我会得到每个城市的列表以及它出现次数的计数。如果我只想要一个看起来超过平均水平的城市列表(如纽约和洛杉矶)怎么办?

5 个答案:

答案 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)]