如何转置R语言DataFrame:将Tempo设为列名、sig_C系列设为group变量
解决方案
在R中实现这种数据重塑需求,不能用基础的t()函数(它仅做简单行列互换,无法保留分组逻辑),推荐使用tidyverse包中的pivot_longer()和pivot_wider()组合完成:
步骤1:加载所需包并定义原始数据
library(tidyverse) # 你的原始数据 df <- structure(list(Tempo = c("t0", "t1", "REC1", "REC2", "REC4", "REC8", "REC11"), sig_C = c("a", "a", "a", "a", "a", "a", "a" ), sig_C1 = c("a", "a", "a", "a", "a", "a", "a"), sig_C2 = c("a", "a", "a", "a", "a", "a", "a"), sig_C3 = c("a", "a", "a", "a", "a", "a", "a"), sig_C4 = c("a", "a", "a", "a", "a", "a", "a"), sig_C5 = c("a", "b", "b", "ab", "ab", "ab", "a")), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))
步骤2:执行数据重塑
result <- df %>% # 先将sig_C到sig_C5列转为长格式,生成group和value列 pivot_longer(cols = starts_with("sig_"), names_to = "group", values_to = "value") %>% # 再将Tempo的取值转为列名,value对应每个group的各Tempo值 pivot_wider(names_from = Tempo, values_from = value)
最终结果预览
运行后得到的result结构如下:
# A tibble: 6 × 8 group t0 t1 REC1 REC2 REC4 REC8 REC11 <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 sig_C a a a a a a a 2 sig_C1 a a a a a a a 3 sig_C2 a a a a a a a 4 sig_C3 a a a a a a a 5 sig_C4 a a a a a a a 6 sig_C5 a b b ab ab ab a
关键逻辑说明
pivot_longer():把宽格式的sig_C至sig_C5列"拉长",将列名存入group变量,对应的值存入value变量,得到每行对应一个group+Tempo的组合。pivot_wider():将长格式数据重新"拉宽",把Tempo的每个取值作为新列名,value的值填充到对应位置,最终得到你需要的结构。
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

