【问题标题】:Creating a count table based on each value in each column in R根据R中每一列中的每个值创建一个计数表
【发布时间】:2019-04-28 21:00:14
【问题描述】:

我有一个这样开头的数据表:

    test <- data.frame("AZ" = c("ABCD, AAAA, BBBB"), "AK" = c("ABCD"), "NJ" = c("BBBC", "AAAA"))

每一列都是一个州(亚利桑那州、阿拉斯加州、新泽西州),这些列中的值是代码。如果单个单元格中有多个代码,则以逗号分隔。

我想创建一个计数表,显示每个州的每个代码显示了多少。所以表格最终会变成这样:

    test2 <- data.frame("ABCD" = c("2", "2", "0"), "AAAA" = c("2", "0", "1"), "BBBB" = c("2", "0", "0"), "BBBC" = c("0", "0", "1"), row.names = c("AZ", "AK", "NJ"))

有没有办法让这样的表格在 R 中输出?我一直在玩 dplyr,但到目前为止还没有运气。谢谢你的帮助:)

【问题讨论】:

    标签: r count dplyr


    【解决方案1】:

    我们可以将gather转换成'long'格式,然后将'value'用分隔符,separate_rows分开,得到频率用countspread转换成'wide'格式

    library(tidyverse)
    gather(test) %>% 
       separate_rows(value) %>% 
       count(key, value) %>%
       spread(value, n, fill = 0) %>%
       column_to_rownames('key')
    #   AAAA ABCD BBBB BBBC
    #AK    0    2    0    0
    #AZ    2    2    2    0
    #NJ    1    0    0    1
    

    注意:如果我们需要'long'格式的输出,则不需要spread

    gather(test) %>% 
        separate_rows(value) %>% 
        count(key, value)
    # A tibble: 6 x 3
    #  key   value     n
    #  <chr> <chr> <int>
    #1 AK    ABCD      2
    #2 AZ    AAAA      2
    #3 AZ    ABCD      2
    #4 AZ    BBBB      2
    #5 NJ    AAAA      1
    #6 NJ    BBBC      1
    

    更新

    如果我们还需要按“行”分组,创建一个row_number() 列,然后将gather 转换为“长”格式和count 上的united 'key' 和'rn'专栏

    test %>%
       mutate(rn = row_number()) %>% 
       gather(key, val, -rn) %>%
       separate_rows(val) %>% 
       unite(key, key, rn) %>% 
       count(key, val) %>% 
       spread(val, n, fill = 0) %>%
       column_to_rownames('key')
    #      AAAA ABCD BBBB BBBC
    #AK_1    0    1    0    0
    #AK_2    0    1    0    0
    #AZ_1    1    1    1    0
    #AZ_2    1    1    1    0
    #NJ_1    0    0    0    1
    #NJ_2    1    0    0    0
    

    或使用base R

    table(stack(lapply(test, function(x) unlist(strsplit(as.character(x), ", "))))[2:1])
    

    【讨论】:

    • 太棒了!太感谢了。有没有一种快速的方法来编辑该代码以获取每行/列组合的计数?所以最后会是这个样子?:
    • @SamanthaSullivan 如果你需要长格式,那么你需要在count这一步停下,不要做spread
    • 有没有办法得到这样的输出? test2
    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多