如何对tibble进行重塑:实现列转行及2×4转2×2格式转换
关于tibble重塑的两个问题解答
一、如何将tibble的列转换为行(宽表转长表)
在tidyverse生态中,最常用的工具是tidyr包的pivot_longer()函数,它可以轻松将多列宽格式数据转换为长格式(列转行)。
基础用法示例
假设你有如下宽格式tibble:
library(tidyverse) wide_tbl <- tibble( 学生ID = 1:2, 数学 = c(90, 85), 英语 = c(88, 92) )
使用pivot_longer()转换为行结构:
long_tbl <- wide_tbl %>% pivot_longer( cols = c(数学, 英语), # 指定需要转换的列 names_to = "科目", # 原列名存入这个新列 values_to = "分数" # 原列值存入这个新列 )
转换后的长格式tibble:
# A tibble: 4 × 3 学生ID 科目 分数 <int> <chr> <dbl> 1 1 数学 90 2 1 英语 88 3 2 数学 85 4 2 英语 92
二、将1×4 tibble转换为2×2 tibble(对应你的示例)
先明确你的输入和目标:
输入tibble:
input_tbl <- tibble(a = "x", b = "x", c = "x", d = "x")
目标输出tibble:
# A tibble: 2 × 2 c d <chr> <chr> a x x b x x
实现方法
这里需要把原tibble的前两列列名(a、b)转为行标识,同时将后两列(c、d)的值重复填充到新tibble的两行中,推荐两种简洁方法:
方法1:转置后筛选整理
output_tbl <- input_tbl %>% t() %>% # 转置为矩阵 as_tibble(rownames = "row_id") %>% # 转换为tibble,行名存入row_id列 filter(row_id %in% c("a", "b")) %>% # 筛选出a、b对应的行 select(-row_id) %>% # 移除row_id列 `rownames<-`(c("a", "b")) # 设置行名为a、b
方法2:直接构造目标tibble
如果需求明确,也可以直接提取原数据的值来构造:
output_tbl <- tibble( c = rep(input_tbl$c, 2), d = rep(input_tbl$d, 2) ) %>% `rownames<-`(c("a", "b"))
两种方法都能得到你需要的2×2 tibble结构。
内容的提问来源于stack exchange,提问作者jakdar
相关产品推荐
相关产品推荐

