在R中保留列名与行名完整转置Data Frame的问题
问题
需要实现类似Excel的转置功能,要求:
- 保留原DataFrame的列名为转置后的第一行
- 原第一行数据作为转置后的列名
已编写代码如下,但转置后出现列名或行名丢失的问题:
Book1 <- read_excel("C:/X/X/X- X/X/Book1.xlsx") dput(Book1) X1 <- as.data.frame(t(Book1)) X2 <- transpose(Book1)
当前使用的DataFrame结构:
structure(list(`Row Labels` = structure(c(1667260800, 1669852800, 1672531200, 1675209600, 1677628800, 1680307200, 1682899200, 1685577600, 1688169600), class = c("POSIXct", "POSIXt"), tzone = "UTC"), X1 = c(1, 2, 2, 3, 3, 4, 4, 5, 5), X2 = c(2, 3, 2, 3, 2, 3, 2, 3, 2), X3 = c(3, 4, 3, 4, 3, 4, 3, 4, 3), X6 = c(1, 1, 1, 1, 1, NA, NA, NA, NA), X7 = c(1, 1, 1, 1, 1, NA, NA, NA, NA), X8 = c(1, 1, 1, 1, 1, NA, NA, NA, NA), X9 = c(1, 1, 1, 1, 1, NA, NA, NA, NA)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L))
解决方案
直接用t()或transpose()转置时,原列名会变成行名,原第一行数据无法直接映射为新列名,导致信息丢失。可以通过以下两种方式实现需求:
方法1:基础R实现
library(readxl) # 读取数据 Book1 <- read_excel("C:/X/X/X- X/X/Book1.xlsx") # 提取原第一行作为新列名(转为字符格式避免时间格式问题) new_cols <- as.character(unlist(Book1[1, ])) # 提取原列名作为转置后的第一行数据 new_first_row <- colnames(Book1) # 转置原数据(排除第一行) transposed_df <- as.data.frame(t(Book1[-1, ])) # 设置转置后的列名 colnames(transposed_df) <- new_cols # 将原列名作为第一行添加到数据框顶部 final_df <- rbind(new_first_row, transposed_df) # 查看结果 print(final_df)
方法2:tidyr包实现(更灵活,保留数据类型)
library(readxl) library(tidyr) library(dplyr) # 读取数据 Book1 <- read_excel("C:/X/X/X- X/X/Book1.xlsx") # 通过变长+变宽实现转置,同时设置列名 final_df <- Book1 %>% # 添加行号用于后续分组转置 mutate(row_num = row_number()) %>% # 将数据转为长格式 pivot_longer(-row_num, names_to = "original_columns", values_to = "values") %>% # 将长格式转回宽格式,实现转置 pivot_wider(names_from = row_num, values_from = "values") %>% # 将原第一行数据设为新列名(排除original_columns列) rename_with(~as.character(unlist(Book1[1, .x])), -original_columns) # 查看结果 print(final_df)
内容的提问来源于stack exchange,提问作者user20203146
相关产品推荐
相关产品推荐

