首页 > 解决方案 > 将单行数据框中的所有列“旋转更长”为两个“值”列

问题描述

标题很复杂,但我不知道如何用语言表达这个问题。所以我来演示一下。

这是我的问题,具有所需的输出:

library(tibble)

# Input:
tribble(
  ~n_1, ~n_2, ~n_3, ~pct_1, ~pct_2, ~pct_3,
  10,   20,   30,   0.1,    0.2,    0.3
)
#> # A tibble: 1 x 6
#>     n_1   n_2   n_3 pct_1 pct_2 pct_3
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1    10    20    30   0.1   0.2   0.3

# Desired output:
tribble(
  ~name, ~n, ~pct,
  1,     10, 0.1,
  2,     20, 0.2,
  3,     30, 0.3
)
#> # A tibble: 3 x 3
#>    name     n   pct
#>   <dbl> <dbl> <dbl>
#> 1     1    10   0.1
#> 2     2    20   0.2
#> 3     3    30   0.3

我试过tidyr::pivot_longer()了,但我做错了。有什么办法吗?

标签: rtidyverse

解决方案


一种选择可能是:

df %>%
 pivot_longer(everything(),    
              names_to = c(".value", "name"),
              names_pattern = "(.*)_(.)")

  name      n   pct
  <chr> <dbl> <dbl>
1 1        10   0.1
2 2        20   0.2
3 3        30   0.3

推荐阅读