簡體   English   中英

按組計算觀察次數

[英]Count number of observations by group

我正在嘗試計算有關特定組的數據集中每個變量的每個觀察值的數量。

數據如下所示:

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()))但它並沒有真正起作用。

任何幫助表示贊賞。 提前致謝!

您還可以使用以下解決方案:

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

獲取長格式數據,計算每組中每列的非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))

使用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

使用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
')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM