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
相关产品推荐
相关产品推荐

