在R中将多变量长格式数据转换为宽格式
R语言:长格式转宽格式实现双边变量拆分
需求说明
将长格式的data.table转换为宽格式,使每个原始变量生成如pta.1、pta.2、iso3n.1、iso3n.2的列,用于后续计算双边层面的平均值。
原始数据
structure(list(pta = c("636", "899", "989", "1007", "561"), cafta_similarity = c(0.81468368791454, 0.68814557488039, 0.96371483934995, 0.71527668922595, 0.69435303348955 ), iso3n = c(124, 124, 124, 124, 152), ccode = c(20, 20, 20, 20, 155), country = c("Canada", "Canada", "Canada", "Canada", "Chile"), year = c("1992", "2016", "2018", "2018", "1960"), gdppc = c(20879.8483300891, 42315.6037056806, 46548.6384108296, 46548.6384108296, 505.349325487754 ), polity2 = c(10, 10, 10, 10, 5), openness = c(52.7380309449972, 65.3636199818813, 66.5818530921921, 66.5818530921921, 46.9745037862152 ), hog_right = c(3, 0, 0, 0, 3), hog_left = c(0L, 1L, 1L, 1L, 0L), hog_center = c(0, 0, 0, 0, 0)), class = c("data.table", "data.frame"), row.names = c(NA, -5L), .internal.selfref = <pointer: 0x7fca56811ae0>)
解决方案
方法1:使用data.table原生函数(适配你的数据结构)
- 加载data.table包:
library(data.table)
- 为每个分组内的观测添加序号(这里以
year为分组键,若你的双边数据有专属配对键,可替换为「配对键+year」):
# 按year分组,给每组内的行分配1、2...的序号 dt[, id := rowid(year)]
- 转换为宽格式:
# 将所有非year、id的变量按id拆分,生成带.1、.2后缀的列 wide_dt <- dcast(dt, year ~ id, value.var = setdiff(names(dt), c("year", "id")))
方法2:使用tidyverse工具链
- 加载tidyverse包:
library(tidyverse)
- 添加分组序号并转宽:
wide_dt <- dt %>% group_by(year) %>% # 可替换为你的双边配对键+year mutate(id = row_number()) %>% ungroup() %>% pivot_wider(names_from = id, values_from = -c(year, id))
后续双边平均值计算
转宽后可直接对对应列计算平均值,示例如下:
# 单个变量计算(如pta的双边均值) wide_dt[, pta_mean := (as.numeric(pta.1) + as.numeric(pta.2)) / 2] # 批量计算所有数值型变量的双边均值 num_cols <- grep("\\.[12]$", names(wide_dt), value = TRUE) # 生成均值列名 mean_col_names <- gsub("\\.[12]$", "_mean", num_cols) # 按变量前缀分组,批量计算行均值 wide_dt[, (mean_col_names) := lapply( split(num_cols, gsub("\\.[12]$", "", num_cols)), function(x) rowMeans(.SD, na.rm = TRUE) ), .SDcols = num_cols]
内容的提问来源于stack exchange,提问作者anatrik
相关产品推荐
相关产品推荐

