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

R语言实现多维度不同表格对应值合并求和的方法问询

问题描述

我需要处理一个大型数据集,从数据框中提取了两个不同变量的列联表以获取频次,示例如下:

table1 <- table(df1$vehicletype, df1$company)
# table1示例结构
#   1 2 3 4 5 6 7
# 1 1 2 3 1 2 6 4
# 2 3 4 3 4 1 2 3
# 3 4 6 3 5 6 7 8

table2 <- table(df1$vehicletype2, df1$company2)
# table2示例结构
#   1 3 4 5 6 7
# 1 3 1 4 1 5 6
# 2 6 3 6 2 0 0
# 3 4 3 6 3 2 1

我希望合并这两个表格,将对应位置的值相加,table2缺少的列(如第2列)视为0,合并后表格示例如下:

#   1 2 3 4 5 6 7 
# 1 4 2 4 5 3 11 10
# 2 9 4 6 10 ......
# 3 ...............

实际场景是跨更长时间范围的多个表格,均存在行列缺失的情况。曾尝试StackOverflow上的方法但未解决,请求可行的实现方案。

解决方案

方法1:Tidyverse工具链(推荐批量处理)

将列联表转成统一的长格式,聚合求和后再转回宽格式,这种方式能轻松适配多个表格的场景:

library(tidyverse)

# 工具函数:把列联表转成带行列名的长格式数据框
table_to_long <- function(tbl) {
  as.data.frame(tbl) %>%
    rename(row = Var1, col = Var2, value = Freq) %>%
    mutate(across(c(row, col), as.character)) # 统一字符类型,避免类型不匹配
}

# 合并所有表格的长格式数据
combined_long <- bind_rows(
  table_to_long(table1),
  table_to_long(table2)
  # 有更多表格直接在这里追加即可
)

# 按行列分组求和,缺失行列自动补0
combined_wide <- combined_long %>%
  group_by(row, col) %>%
  summarise(total = sum(value, na.rm = TRUE), .groups = "drop") %>%
  pivot_wider(names_from = col, values_from = total, values_fill = 0) %>%
  column_to_rownames("row")

# 转成矩阵格式(可选,还原列联表样式)
combined_table <- as.matrix(combined_wide)

方法2:Base R实现(无需额外包)

先统一所有表格的行列维度,补全缺失位置为0后再逐元素相加:

# 获取所有唯一的行名和列名
all_rows <- unique(c(rownames(table1), rownames(table2)))
all_cols <- unique(c(colnames(table1), colnames(table2)))

# 补全两个表格的行列,缺失位置填充0
table1_full <- matrix(0, nrow = length(all_rows), ncol = length(all_cols),
                      dimnames = list(all_rows, all_cols))
table1_full[rownames(table1), colnames(table1)] <- table1

table2_full <- matrix(0, nrow = length(all_rows), ncol = length(all_cols),
                      dimnames = list(all_rows, all_cols))
table2_full[rownames(table2), colnames(table2)] <- table2

# 两表相加得到结果
combined_table <- table1_full + table2_full

如果要处理多个表格,可将表格存入列表批量处理:

# 示例:把所有目标表格存入列表
tables_list <- list(table1, table2) # 可继续添加其他表格

# 获取全局唯一的行名和列名
all_rows <- unique(unlist(lapply(tables_list, rownames)))
all_cols <- unique(unlist(lapply(tables_list, colnames)))

# 批量补全每个表格的行列
full_tables <- lapply(tables_list, function(tbl) {
  mat <- matrix(0, nrow = length(all_rows), ncol = length(all_cols),
                dimnames = list(all_rows, all_cols))
  mat[rownames(tbl), colnames(tbl)] <- tbl
  mat
})

# 所有表格求和得到最终结果
combined_table <- Reduce("+", full_tables)

内容的提问来源于stack exchange,提问作者Filip1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:29