【问题标题】:group_by and count number of elements in each column in Rgroup_by 并计算 R 中每列中的元素数
【发布时间】:2019-07-23 02:38:13
【问题描述】:

我有一个如下的数据表:

city         year    t_20   t_25 
Seattle      2019    82      91  
Seattle      2018     0      103   
NYC          2010    78       8 
DC           2011    71       0  
DC           2011     0       0    
DC           2018    60       0

我想将它们按cityyear 分组 并计算每组中零的数量。

我该怎么做? summarize_at?

df %>% group_by(city, year) %>% summarise_at( WHAT GOES HERE , vars(t_20:t_25))

summarize_at 的第一个参数应该是什么?

还是其他方式? tally?

【问题讨论】:

    标签: r group-by aggregate summarize


    【解决方案1】:

    一个选项是在summariseing 之前从宽到长重塑

    library(tidyverse)
    df %>%
        gather(k, v, -city, -year) %>%
        group_by(city, year) %>%
        summarise(n_0 = sum(v == 0)) 
    #    # A tibble: 5 x 3
    ## Groups:   city [?]
    #  city     year   n_0
    #  <fct>   <int> <int>
    #1 DC       2011     3
    #2 DC       2018     1
    #3 NYC      2010     0
    #4 Seattle  2018     1
    #5 Seattle  2019     0
    

    总结每一列,你可以做

    df %>%
        group_by(city, year) %>%
        summarise_all(funs(sum(. == 0)))
    ## A tibble: 5 x 4
    ## Groups:   city [?]
    #  city     year  t_20  t_25
    #  <fct>   <int> <int> <int>
    #1 DC       2011     1     2
    #2 DC       2018     0     1
    #3 NYC      2010     0     0
    #4 Seattle  2018     1     0
    #5 Seattle  2019     0     0
    

    样本数据

    df <- read.table(text =
        "city         year    t_20   t_25
    Seattle      2019    82      91
    Seattle      2018     0      103
    NYC          2010    78       8
    DC           2011    71       0
    DC           2011     0       0
    DC           2018    60       0", header = T)
    

    【讨论】:

    • 谢谢。但是在您的结果中,不清楚t_20t_25 的每一列中有多少个零。它说例如DC 2011 3,但我想知道每列中有多少个零。
    • 我看到了@NoLie;在那种情况下,我误解了;我认为整个练习是对所有列求和。单独为每一列执行此操作甚至更短,请参阅我的更新。
    • 太棒了。真的非常感谢你
    【解决方案2】:

    简单的 group by 操作很适合使用 SQL 来制定。对于那些倾向于 SQL 的人,我们也可以尝试使用 sqldf 库来解决这个问题:

    library(sqldf)
    
    sql <- "SELECT city, COUNT(CASE WHEN t_20 = 0 THEN 1 END) AS t_20_cnt,
                COUNT(CASE WHEN t_25 = 0 THEN 1 END) AS t_25_cnt
            FROM df
            GROUP BY city"
    
    output <- sqldf(sql)
    

    【讨论】:

    • 也可以试试:SELECT city, SUM(t_20 = 0) AS t_20_cnt, SUM(t_25 = 0) AS t_25_cnt ...
    • @G.Grothendieck 我不知道 SQLite 支持这种语法。很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2016-05-22
    • 2013-09-26
    相关资源
    最近更新 更多