【问题标题】:Count number of observations by group按组计算观察次数
【发布时间】:2021-05-17 12:06:00
【问题描述】:

我正在尝试计算数据集中每个变量对特定组的每个观察次数。

数据如下:

grp v1  vn 
1   2   5  
2   4      
3   3   4
1       3
1   2   12
4       5
5   3   6
5   6

结果应该是这样的表格:

grp v1 vn
1   2  3
2   1  0
3   1  1
4   0  1
5   2  1

我尝试使用 x %>% group_by(grp) %>% summarise(across(everything(),n = n())) 但它并没有真正奏效。

感谢任何帮助。提前致谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    您也可以使用以下解决方案:

    library(dplyr)
    
    df %>%
      group_by(grp) %>%
      summarise(across(v1:vn, ~ sum(!is.na(.x))))
    
    # A tibble: 5 x 3
        grp    v1    vn
      <int> <int> <int>
    1     1     2     3
    2     2     1     0
    3     3     1     1
    4     4     0     1
    5     5     2     1
    

    【讨论】:

      【解决方案2】:

      获取长格式数据,统计每组每列的非NA值,获取宽格式数据。

      library(dplyr)
      library(tidyr)
      
      df %>%
        pivot_longer(cols = -grp) %>%
        group_by(grp, name) %>%
        summarise(n = sum(!is.na(value))) %>%
        ungroup %>%
        pivot_wider(names_from = name, values_from = n)
      
      #    grp    v1    vn
      #  <int> <int> <int>
      #1     1     2     3
      #2     2     1     0
      #3     3     1     1
      #4     4     0     1
      #5     5     2     1
      

      数据

      df <- structure(list(grp = c(1L, 2L, 3L, 1L, 1L, 4L, 5L, 5L), v1 = c(2L, 
      4L, 3L, NA, 2L, NA, 3L, 6L), vn = c(5L, NA, 4L, 3L, 2L, 5L, 6L, 
      NA)), class = "data.frame", row.names = c(NA, -8L))
      

      【讨论】:

        【解决方案3】:

        使用data.table

        library(data.table)
        setDT(df)[, lapply(.SD, function(x) sum(!is.na(x))), grp]
        #   grp v1 vn
        #1:   1  2  3
        #2:   2  1  0
        #3:   3  1  1
        #4:   4  0  1
        #5:   5  2  1
        

        【讨论】:

          【解决方案4】:

          使用aggregate

          aggregate(cbind(v1, vn) ~ grp, replace(dat, is.na(dat), 0), function(x) sum(as.logical(x)))
          #   grp v1 vn
          # 1   1  2  3
          # 2   2  1  0
          # 3   3  1  1
          # 4   4  0  1
          # 5   5  2  1
          

          数据:

          dat <- read.table(header=T, text='grp v1  vn 
          1   2   5  
          2   4   NA   
          3   3   4
          1   NA  3
          1   2   12
          4   NA  5
          5   3   6
          5   6   NA
          ')
          

          【讨论】:

            猜你喜欢
            • 2021-04-26
            • 1970-01-01
            • 2013-03-06
            • 1970-01-01
            • 2022-11-07
            • 2022-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多