【问题标题】:How do I filter the results in table()如何过滤 table() 中的结果
【发布时间】:2017-12-12 17:11:42
【问题描述】:

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

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

【问题讨论】:

  • 如果您提供带有示例输入和所需输出的reproducible example,会更容易为您提供帮助。
  • 只需将您的 table() 结果保存到一个对象中并对其进行排序。使用 base,soy 可以使用 df[order(variale_to_be_sorted), ] 对其进行排序

标签: r


【解决方案1】:

对于一个因素,table 将返回一个数组(类似于向量)。因此,为了“过滤”它,您需要使用您指定的任何条件对其进行子集化。

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

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

编辑:

OP 将请求从前四分之一更改为“高于平均水平”。这更简单:

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

【讨论】:

    【解决方案2】:

    这是一个你可以运行的例子:

    dat <- sample(1:10, size = 200, replace = TRUE)
    
    dat_table <- table(dat)
    
    dat_table[dat_table >= quantile(dat_table, probs = 0.75 )]
    

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

      • 领带可能有问题(就频率而言)?
      • 是的,这绝对是一个“快速而肮脏”的解决方案。真的只是展示了使用非常基本的命令可以走多远。
      【解决方案4】:

      使用虚拟数据的 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
      

      【讨论】:

        【解决方案5】:

        又一个例子:

        # 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)]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-02
          • 2013-10-06
          • 1970-01-01
          • 1970-01-01
          • 2020-01-31
          • 2019-05-15
          • 2017-05-03
          • 1970-01-01
          相关资源
          最近更新 更多