如何在Tidyverse或baseR中转置含n个支点的数据框?
数据框列转行并批量重命名的高效实现(Base R/Tidyverse)
原始数据框定义:
mydf = data.frame(x = 1:3, y = as.complex(1:3), z = c('i','j','k'), stringsAsFactors = FALSE)
期望输出(将原数据框的每列元素依次展开为一行,并将列名改为a到i):
a b c d e f g h i 1 1 2 3 1+0i 2+0i 3+0i i j k
Base R 实现方法
核心思路是将数据框的所有元素按列提取为向量,转置为单行后转为数据框,最后批量设置列名:
# 提取所有元素为向量并转置为单行 result_base <- as.data.frame(t(unlist(mydf))) # 用字母序列设置列名 colnames(result_base) <- letters[1:ncol(result_base)]
unlist(mydf):将数据框的每列元素按顺序拼接成一个一维向量t():将向量转置为单行矩阵,再转为数据框letters:R内置的小写字母向量,自动匹配结果列数生成列名
Tidyverse 实现方法
利用管道语法简化操作,逻辑和Base R一致,更符合tidy风格:
library(tidyverse) result_tidy <- mydf %>% unlist() %>% # 提取所有元素为向量 t() %>% # 转置为单行 as.data.frame(stringsAsFactors = FALSE) %>% set_names(letters[1:ncol(.)]) # 设置列名
如果需要更贴合tidyverse的函数习惯,也可以用map系列函数实现(注意保留复数格式的话,优先用unlist()):
result_tidy <- mydf %>% map(~.x) %>% # 将每列转为列表元素 unlist() %>% # 展平为向量,保留复数属性 t() %>% as.data.frame(stringsAsFactors = FALSE) %>% set_names(letters[1:ncol(.)])
内容的提问来源于stack exchange,提问作者R5-D4
相关产品推荐
相关产品推荐

