在R语言中基于两列多值生成统计表格的方法求助
问题:按State聚合QCT各取值的计数
样本数据集
ID <- c(1:10) State <- c("AL", "AL", "AL", "TX", "TX", "TX", "TX", "TX", "WY", "WY") QCT <- c(1, 2, 1, 2, 2, 2, 1, 1, 2, NA) df <- data.frame(ID, State, QCT) print(df)
输出:
ID State QCT 1 1 AL 1 2 2 AL 2 3 3 AL 1 4 4 TX 2 5 5 TX 2 6 6 TX 2 7 7 TX 1 8 8 TX 1 9 9 WY 2 10 10 WY NA
需求
以State列为行,统计每个State下QCT列各唯一值(包括NA)的出现次数,预期输出:
State 1 2 NA AL 2 1 0 TX 2 3 0 WY 0 1 1
解决方案
方法1:tidyverse(dplyr + tidyr)
核心是先按State和QCT分组计数,再转宽格式并填充缺失值为0:
library(dplyr) library(tidyr) result <- df %>% group_by(State, QCT, .drop = FALSE) %>% # 保留所有QCT取值,包括NA summarise(count = n(), .groups = "drop") %>% pivot_wider( names_from = QCT, values_from = count, values_fill = 0, # 缺失计数填充为0 names_glue = "{QCT}" ) print(result)
输出:
# A tibble: 3 × 4 State `1` `2` `NA` <chr> <int> <int> <int> 1 AL 2 1 0 2 TX 2 3 0 3 WY 0 1 1
方法2:data.table(适合49万条级别的大数据集,效率更高)
针对大规模观测数据,data.table的运算速度优势更明显:
library(data.table) setDT(df) # 按State和QCT分组计数 count_dt <- df[, .N, by = .(State, QCT)] # 转宽格式并填充0 result_dt <- dcast( count_dt, State ~ QCT, value.var = "N", fill = 0, drop = FALSE # 保留所有QCT取值 ) print(result_dt)
输出:
State 1 2 NA 1: AL 2 1 0 2: TX 2 3 0 3: WY 0 1 1
关键注意点
- 必须设置
.drop=FALSE(dplyr)或drop=FALSE(data.table),否则QCT的NA值会被自动忽略,无法统计其出现次数。 - 通过
values_fill=0或fill=0确保某个State没有对应QCT值时,计数显示为0而非空白。
内容的提问来源于stack exchange,提问作者Tathagato
相关产品推荐
相关产品推荐

