如何在R语言中将长格式数据转换为宽格式(按AAA字段合并行)
解决R数据框按分组展开为多列的问题
原始数据
AAA <- c('APIS', 'APIS', 'PIPIS', 'AGAROS', 'AGAROS', 'AGAROS', 'NOTHING') BBB <- c('a', 'a', 'a', 'b', 'b', 'c', NA) CCC <- c(1, 2, NA, 4, 5, 6, 7) DDD <- c("Mat", "ASG", "MNT", "NBEH", "DJ", "EU", "DHR") test.data <- data.frame(AAA, BBB, CCC, DDD)
需求说明
将数据重塑为每个唯一AAA值对应一行的格式,同一AAA的重复条目自动生成带1、2、3...后缀的新列,最终列名格式为原列名_序号。
解决方案
用dplyr分组添加行号,再结合tidyr的pivot_wider实现宽格式转换,代码如下:
# 加载所需包 library(dplyr) library(tidyr) # 1. 给每个AAA分组添加行号 test_data_with_id <- test.data %>% group_by(AAA) %>% mutate(row_id = row_number()) %>% ungroup() # 2. 转换为宽格式,指定列名后缀 output <- test_data_with_id %>% pivot_wider( id_cols = AAA, names_from = row_id, values_from = c(BBB, CCC, DDD), names_glue = "{.value}_{row_id}" ) # 查看结果 output
输出结果
运行后得到的结果与预期一致:
# A tibble: 4 × 10 AAA BBB_1 CCC_1 DDD_1 BBB_2 CCC_2 DDD_2 BBB_3 CCC_3 DDD_3 <chr> <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr> 1 APIS a 1 Mat a 2 ASG NA NA NA 2 PIPIS a NA MNT NA NA NA NA NA NA 3 AGAROS b 4 NBEH b 5 DJ c 6 EU 4 NOTHING NA 7 DHR NA NA NA NA NA NA
内容的提问来源于stack exchange,提问作者SUMIT
相关产品推荐
相关产品推荐

