首页 > 解决方案 > 使用 tidyr::pivot_longer 转换单行数据框:获取列对并将它们堆叠

问题描述

我有一个单行数据框。成对的列放在一起,其中一个包含名称,另一个包含值。因此,我想将名称和列组合从 1 行格式提取为堆叠格式,其中一列用于名称,另一列用于值。我正在尝试pivot_longer,但不知何故无法完成。

数据

library(tidyverse)

df <-
tribble(~ var_1, ~ var_1_value, ~ var_2, ~ var_2_value, ~ var_3, ~ var_3_value,
        "height", 200, "weight", 400, "length", 1000)

> df

##   var_1  var_1_value var_2  var_2_value var_3  var_3_value
##   <chr>        <dbl> <chr>        <dbl> <chr>        <dbl>
## 1 height         200 weight         400 length        1000

期望的输出

  var_name var_value
  <chr>        <dbl>
1 height         200
2 weight         400
3 length        1000

我试过的

df %>%
  pivot_longer(cols = everything(),
               names_to = ".value",
               names_pattern = "var_[0-9]_(.*)")

##   value
##   <dbl>
## 1   200
## 2   400
## 3  1000

我知道这是一个相当基本的问题,但我不知道如何解决这个问题,也没有找到类似的已回答问题。谢谢!

标签: rtidyr

解决方案


pivot_longer您现在拥有列名的方式,直接在此上使用并不容易。您可以更改列名称,如:

names(df) <- paste0(sub('_value', '', names(df)), c('_char', '_value'))
df

# A tibble: 1 x 6
#  var_1_char var_1_value var_2_char var_2_value var_3_char var_3_value
#  <chr>            <dbl> <chr>            <dbl> <chr>            <dbl>
#1 height             200 weight             400 length            1000

然后使用pivot_longer

tidyr::pivot_longer(df, 
                    cols = everything(), 
                    names_to = ".value",
                    names_pattern = 'var_\\d+_(.*)')

#  char   value
#  <chr>  <dbl>
#1 height   200
#2 weight   400
#3 length  1000

推荐阅读