在R语言中使用pivot_wider实现样本为列、测试项为行的数据转置
解决方法
你需要先将数据集转换为长格式,再进行宽格式重构,才能得到行名为测试项、列名为样本的目标结构。
错误原因分析
你之前的pivot_wider(names_from = sample, values_from = 2:4)会把test_1/test_2/test_3三列分别与每个样本组合,生成test_1_A这类复合列名,这和你想要的结构不符。
正确的tidyverse实现代码
library(tidyverse) # 原始数据集 df <- data.frame(sample=c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'), test_1=c(2, 1, 4, 3, 5, 2, 1, 4), test_2=c(8, 3, 9, 6, 8, 10, 7, 7), test_3=c(4, 3, 4, 5, 3, 4, 5, 4)) # 第一步:转成长格式,提取测试项和对应数值 df_long <- df %>% pivot_longer(cols = starts_with("test_"), names_to = "test_item", values_to = "value") # 第二步:重构为目标宽格式 df_wide <- df_long %>% pivot_wider(names_from = sample, values_from = value) # 查看结果 df_wide
运行结果
# A tibble: 3 × 9 test_item A B C D E F G H <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 test_1 2 1 4 3 5 2 1 4 2 test_2 8 3 9 6 8 10 7 7 3 test_3 4 3 4 5 3 4 5 4
可选:基础R转置方法
如果你不想使用tidyverse,也可以用基础R的转置函数t(),只需调整行名列名即可:
# 转置(先排除sample列) df_transposed <- t(df[, -1]) # 设置列名为样本名 colnames(df_transposed) <- df$sample # 转换为数据框并保留行名 df_transposed <- as.data.frame(df_transposed) df_transposed
运行后结果:
A B C D E F G H test_1 2 1 4 3 5 2 1 4 test_2 8 3 9 6 8 10 7 7 test_3 4 3 4 5 3 4 5 4
内容的提问来源于stack exchange,提问作者Georble02
相关产品推荐
相关产品推荐

