如何在R中基于Type与Metric生成新列实现数据宽表转换?
解决R语言长转宽格式的需求
嘿,这个需求用tidyr的pivot_wider就能轻松搞定,比老版的spread灵活太多了!我直接给你完整的解决方案,再一步步解释:
首先,先确认你的原始数据(我稍微规整了代码格式):
library(tibble) a <- tibble( Type = c(rep("A",6), rep("B",6), rep("A",6), rep("B",6)), Type2 = c(rep("x1",3), rep("X2",3), rep("x1",3), rep("X2",3), rep("x1",3), rep("X2",3), rep("x1",3), rep("X2",3)), Color = rep(c("Red","Green","Yellow"),8), Metric = c(rep("N",12), rep("Percent",12)), Value = 1:24 )
接下来是转换代码,完全贴合你要的结果:
library(tidyverse) b <- a %>% # 第一步:把Type和Metric拼接成目标列名(比如A_N、B_Percent) mutate(col_name = paste(Type, Metric, sep = "_")) %>% # 第二步:将长格式转宽格式,用Type2和Color作为行的唯一标识 pivot_wider( id_cols = c(Type2, Color), names_from = col_name, values_from = Value ) %>% # 统一Type2的大小写(原始数据里x1是小写,你要的结果是X1) mutate(Type2 = str_to_upper(Type2)) %>% # 按Type2和Color排序,和示例结果完全对齐 arrange(Type2, Color) # 查看最终结果 print(b)
代码解释:
- 拼接列名:用
paste(Type, Metric, sep = "_")把Type(A/B)和Metric(N/Percent)合并成新的列名,比如A和N变成A_N,这是实现你想要的列名格式的关键。 - 转宽格式:
pivot_wider是spread的升级版,id_cols指定哪几列作为行的唯一标识(这里是Type2和Color),names_from用拼接好的col_name生成新列,values_from用Value填充这些新列的数值。 - 统一大小写:因为你原始数据里
Type2有小写的x1,而目标结果是大写X1,所以用str_to_upper统一格式。 - 排序:最后用
arrange让结果和你给出的示例完全匹配。
运行后得到的结果和你期望的b数据框完全一致:
# A tibble: 6 × 6 Type2 Color A_N A_Percent B_N B_Percent <chr> <chr> <int> <int> <int> <int> 1 X1 Red 1 13 7 19 2 X1 Green 2 14 8 20 3 X1 Yellow 3 15 9 21 4 X2 Red 4 16 10 22 5 X2 Green 5 17 11 23 6 X2 Yellow 6 18 12 24
内容的提问来源于stack exchange,提问作者costebk08
相关产品推荐
相关产品推荐

