如何在R中重塑数据以生成指定的宽格式表头?
数据重塑:生成指定表头的宽表解决方案
问题说明
现有如下原始数据:
df<-read.table (text="name IV IM AZ No No AZ No Yes AZ No No AZ No Yes KL No No KL Yes Yes KL Yes Yes KL No No ", header=TRUE)
需要将其转换为按name分组,把每组内的IV、IM分别按顺序展开为Iv1-Iv4、IM1-IM4的宽表,目标格式如下:
name Iv1 Iv2 Iv3 Iv4 IM1 IM2 IM3 IM4 AZ No No No No No Yes No Yes KL No Yes Yes No No Yes Yes No
此前尝试reshape(df, idvar = "name", timevar = "IV", direction = "wide")未得到预期结果。
解决方法
问题核心是要为每个name组内的行添加行序号作为分组依据,而非直接使用IV字段。以下提供两种实现方式:
方法1:基础R实现
- 为每组添加行号标识:
df$row_id <- ave(rep(1, nrow(df)), df$name, FUN = seq_along)
- 用
reshape函数完成重塑:
result <- reshape(df, idvar = "name", timevar = "row_id", direction = "wide")
- 调整列名匹配目标格式:
colnames(result) <- gsub("IV\\.(\\d+)", "Iv\\1", colnames(result)) colnames(result) <- gsub("IM\\.(\\d+)", "IM\\1", colnames(result))
方法2:tidyverse工具链实现(dplyr + tidyr)
若习惯tidyverse语法,代码更简洁直观:
library(dplyr) library(tidyr) result <- df %>% group_by(name) %>% mutate(row_id = row_number()) %>% pivot_wider(names_from = row_id, values_from = c(IV, IM), names_glue = "{.value}{row_id}") %>% rename_with(~gsub("IV", "Iv", .x), starts_with("IV")) %>% ungroup()
结果验证
运行上述代码后,输出结果与目标格式完全一致:
> result # A tibble: 2 × 9 name Iv1 Iv2 Iv3 Iv4 IM1 IM2 IM3 IM4 <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 AZ No No No No No Yes No Yes 2 KL No Yes Yes No No Yes Yes No
内容的提问来源于stack exchange,提问作者user330
相关产品推荐
相关产品推荐

