【问题标题】:performing frequency table by group with calculation count of value in R按组执行频率表,计算 R 中的值计数
【发布时间】:2019-01-25 07:47:04
【问题描述】:

假设这是我的数据集

(dput)
dataset<-structure(list(group1 = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L), .Label = c("b", "x"), class = "factor"), group2 = structure(c(2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("g", "y"), class = "factor"), 
    var1 = c(2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L)), .Names = c("group1", 
"group2", "var1"), class = "data.frame", row.names = c(NA, -9L
))

我需要计算两组的频率

x+y
b+g

对于变量 var1,计算 1 个值和 2 个值的计数。对于每个组。 所以想要的输出

        total_count_of_group    var1-1  var1-2
x   y          5                   
                              3         2
b   g          4              2         2

这个输出意味着 total_count_of_group x+y=5 obs。由这个组。 其中 1 个值符合 3 次,2 个值符合 2 次。

相似 total_count_of_group b+g=4 obs。由这个组。 其中 1 个值符合 2 次,2 个值符合 2 次。

如何得到这样的表?

【问题讨论】:

    标签: r dplyr data.table lapply


    【解决方案1】:

    这是tidyverse 解决方案:

    library(tidyverse)
    dataset %>%
      group_by(group1, group2) %>%
      summarize(total = n(), x = list(table(var1) %>% as_tibble %>% spread(var1,n))) %>%
      unnest
    
    # # A tibble: 2 x 5
    # # Groups:   group1 [2]
    #   group1 group2 total   `1`   `2`
    #   <fct>  <fct>  <int> <int> <int>
    # 1 b      g          4     2     2
    # 2 x      y          5     3     2
    

    【讨论】:

      【解决方案2】:

      这是一个使用base R的选项

      out <- aggregate(cbind(var = rep(1, nrow(df1))) ~ ., 
          transform(df1, counts = ave(var1, group1, group2, FUN = length)), length)
      reshape(out, idvar = c('group1', 'group2', 'counts'),
           timevar= 'var1', direction= 'wide')
      #   group1 group2 counts var.1 var.2
      #1      b      g      4     2     2
      #3      x      y      5     3     2
      

      【讨论】:

        【解决方案3】:

        这可以分两步解决:

        1. 汇总组总数并更新dataset
        2. 从长格式改成宽格式

        使用data.table:

        library(data.table)
        dcast(setDT(dataset)[, total_count_of_group := .N, by =. (group1, group2)], 
              group1 + group2 + total_count_of_group~ paste0("var1=", var1), length)
        
           group1 group2 total_count_of_group var1_1 var1_2
        1:      b      g                    4      2      2
        2:      x      y                    5      3      2
        

        请注意,这将适用于var1 中任意数量的不同值以及任意数量的组。

        【讨论】:

          【解决方案4】:
          library(tidyverse)
          
          dataset %>%
            group_by(group1, group2) %>%             # for each combination of groups
            mutate(counts = n()) %>%                 # count number of rows
            count(group1, group2, var1, counts) %>%  # count unique combinations 
            spread(var1, n, sep = "_") %>%           # reshape dataset
            ungroup()                                # forget the grouping
          
          # # A tibble: 2 x 5
          #   group1 group2 counts var1_1 var1_2
          #   <fct>  <fct>   <int>  <int>  <int>
          # 1 b      g           4      2      2
          # 2 x      y           5      3      2
          

          【讨论】:

            【解决方案5】:

            您可以生成三个表,选择相关的计数,然后合并到一个数据框中。

            a <- table(dataset$group1, dataset$group2)
            b <- table(dataset$var1[dataset$group1=='x'])
            d <- table(dataset$var1[dataset$group1=='b'])
            
            data.frame(total_count_of_group = c(a[2,2], a[1,1]), 
                       var1_1 = c(b[1], b[2]),
                       var1_2 = c(d[1], d[2]))
            
              total_count_of_group var1_1 var1_2
            1                    5      3      2
            2                    4      2      2
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-12
              • 1970-01-01
              相关资源
              最近更新 更多