如何按列合并列数不同的频率表?
解决频率表合并问题
你用cbind直接合并不同长度的频率表之所以出错,是因为cbind只按位置拼接,不会匹配行名(也就是你的类别值),导致数据错位或者缺失。下面是正确的合并方法,能得到你想要的格式:
步骤1:将每个频率表转为带类别列的数据框
先把每个table对象转换成标准数据框,保留类别作为单独一列:
# 先加载dplyr包,没有的话先运行 install.packages("dplyr") library(dplyr) # 转换并重命名列 df_45_1 <- as.data.frame(table_45_1) %>% rename(类别 = Var1, 45_1 = Freq) df_45_3 <- as.data.frame(table_45_3) %>% rename(类别 = Var1, 45_3 = Freq) df_45_6 <- as.data.frame(table_45_6) %>% rename(类别 = Var1, 45_6 = Freq) df_45_12 <- as.data.frame(table_45_12) %>% rename(类别 = Var1, 45_12 = Freq)
步骤2:全连接合并并补全缺失值
通过全连接(full_join)匹配所有类别,把缺失的频率值补为0:
# 合并所有数据框 merged_df <- df_45_1 %>% full_join(df_45_3, by = "类别") %>% full_join(df_45_6, by = "类别") %>% full_join(df_45_12, by = "类别") %>% # 把缺失的频率替换成0 mutate(across(-类别, ~replace_na(.x, 0))) %>% # 按类别排序 arrange(类别)
最终结果
运行后merged_df就是你要的格式:
| 类别 | 45_1 | 45_3 | 45_6 | 45_12 |
|---|---|---|---|---|
| 1 | 30 | 10 | 12 | 1 |
| 2 | 4 | 8 | 5 | 0 |
| 3 | 1 | 1 | 0 | 0 |
| 4 | 0 | 1 | 0 | 0 |
内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

