如何在R中将含国家与数值的两列表格转换为除法表?
用tidy风格实现除法表转换
可以借助tidyverse工具链完成这个需求,核心是通过交叉连接生成所有国家的配对组合,计算比值后转成宽表,具体步骤如下:
示例代码
library(tidyverse) # 构造示例数据(替换成你的实际数据) df <- tibble( Country = c("USA", "China", "Japan", "Germany"), Value = c(100, 80, 50, 60) ) # 生成除法表 division_table <- df %>% # 交叉连接自身,得到所有国家的行/列配对 cross_join(df, suffix = c("_row", "_col")) %>% # 计算行国家数值除以列国家数值的结果 mutate(ratio = Value_row / Value_col) %>% # 转换为宽表格式,行是行国家,列是列国家 pivot_wider( id_cols = Country_row, names_from = Country_col, values_from = ratio ) %>% # 可选:将行标识列重命名为更直观的名称 rename(国家 = Country_row) # 查看结果 print(division_table)
代码说明
cross_join(df, df):把原始数据和自身做交叉连接,生成所有可能的国家配对(包括国家自身和自身的配对),后缀区分行和列对应的字段。mutate(ratio = Value_row / Value_col):计算每一组配对的数值除法结果。pivot_wider():将长格式的配对数据转换为宽表,让行名和列名都是国家名称,单元格填充对应的除法结果。
如果不需要保留“国家自身除以自身”的行/列,可以在cross_join之后添加filter(Country_row != Country_col)过滤掉这类组合。
内容的提问来源于stack exchange,提问作者hex
相关产品推荐
相关产品推荐

