You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:48:24