«Увеличить длину» всех столбцов в однорядном фрейме данных в два столбца «значения»

#r #tidyverse

#r #tidyverse

Вопрос:

Заголовок сложный, но я не знаю, как выразить эту проблему словами. Итак, я продемонстрирую.

Вот моя проблема, с желаемым результатом:

 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() , но не могу сделать это правильно. Есть какой-нибудь способ?

Ответ №1:

Одним из вариантов может быть:

 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
  

Ответ №2:

Попробуйте этот подход. Поскольку ваша основная переменная объединена, вы можете использовать separate() (using sep='_' ) после pivot_longer() и затем pivot_wider() для получения ожидаемого фрейма данных. Здесь код:

 library(tidyverse)
#Code
df %>% pivot_longer(cols = everything()) %>%
  separate(name,into = c('var','name'),sep = '_') %>%
  pivot_wider(names_from = var,values_from=value)
  

Вывод:

 # A tibble: 3 x 3
  name      n   pct
  <chr> <dbl> <dbl>
1 1        10   0.1
2 2        20   0.2
3 3        30   0.3
  

Некоторые используемые данные (те, которые вы предоставили):

 #Data
df <- structure(list(n_1 = 10, n_2 = 20, n_3 = 30, pct_1 = 0.1, pct_2 = 0.2, 
    pct_3 = 0.3), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"))