Поворот больше с несколькими столбцами и значениями - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть фрейм данных в формате

# A tibble: 6 x 8
  type  id    age2000 age2001 age2002 bool2000 bool2001 bool2002
  <chr> <chr> <chr>   <chr>   <chr>   <chr>    <chr>    <chr>   
1 1     1     20      21      22      1        1        1       
2 1     2     35      36      37      2        2        2       
3 1     3     24      25      26      1        1        1       
4 2     1     32      33      34      2        2        2       
5 2     2     66      67      68      2        2        2       
6 2     3     14      15      16      1        1        1       

, и я хотел бы использовать pivot_longer из вселенной tidyr для генерации продольных данных в форме:

# A tibble: 18 x 5
   type  id    age   bool  year 
   <chr> <chr> <chr> <chr> <chr>
 1 1     1     20    1     2000 
 2 1     1     21    1     2001 
 3 1     1     22    1     2002 
 4 1     2     35    2     2000 
 5 1     2     36    2     2001 
 6 1     2     37    2     2002 
 7 1     3     24    1     2000 
 8 1     3     25    1     2001 
 9 1     3     26    1     2002 
10 2     1     32    2     2000 
11 2     1     33    2     2001 
12 2     1     34    2     2002 
13 2     2     66    2     2000 
14 2     2     67    2     2001 
15 2     2     68    2     2002 
16 2     3     14    1     2000 
17 2     3     15    1     2001 
18 2     3     16    1     2002

Кто-нибудь есть здесь? знаете решение этой проблемы, с которой я сталкиваюсь?

Большое спасибо за любые советы!

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы можете использовать names_pattern здесь.

tidyr::pivot_longer(df, 
                    cols = -c(id, type), 
                    names_to = c('.value', 'year'),
                    names_pattern = '([a-z]+)(\\d+)')


# A tibble: 18 x 5
#    type    id year    age  bool
# * <int> <int> <chr> <int> <int>
# 1     1     1 2000     20     1
# 2     1     1 2001     21     1
# 3     1     1 2002     22     1
# 4     1     2 2000     35     2
# 5     1     2 2001     36     2
# 6     1     2 2002     37     2
# 7     1     3 2000     24     1
# 8     1     3 2001     25     1
# 9     1     3 2002     26     1
#10     2     1 2000     32     2
#11     2     1 2001     33     2
#12     2     1 2002     34     2
#13     2     2 2000     66     2
#14     2     2 2001     67     2
#15     2     2 2002     68     2
#16     2     3 2000     14     1
#17     2     3 2001     15     1
#18     2     3 2002     16     1

данные

df <- structure(list(type = c(1L, 1L, 1L, 2L, 2L, 2L), id = c(1L, 2L, 
3L, 1L, 2L, 3L), age2000 = c(20L, 35L, 24L, 32L, 66L, 14L), age2001 = c(21L, 
36L, 25L, 33L, 67L, 15L), age2002 = c(22L, 37L, 26L, 34L, 68L, 
16L), bool2000 = c(1L, 2L, 1L, 2L, 2L, 1L), bool2001 = c(1L, 
2L, 1L, 2L, 2L, 1L), bool2002 = c(1L, 2L, 1L, 2L, 2L, 1L)), 
class = "data.frame", row.names = c(NA, -6L))
0 голосов
/ 23 апреля 2020

Мы можем передать регулярное выражение в names_sep

library(dplyr)
library(tidyr)
df %>%
    pivot_longer(cols = -c(id, type), names_to = c('.value', 'year'),
          names_sep= "(?<=[a-z])(?=[0-9])")
# A tibble: 18 x 5
#    type    id year    age  bool
#   <int> <int> <chr> <int> <int>
# 1     1     1 2000     20     1
# 2     1     1 2001     21     1
# 3     1     1 2002     22     1
# 4     1     2 2000     35     2
# 5     1     2 2001     36     2
# 6     1     2 2002     37     2
# 7     1     3 2000     24     1
# 8     1     3 2001     25     1
# 9     1     3 2002     26     1
#10     2     1 2000     32     2
#11     2     1 2001     33     2
#12     2     1 2002     34     2
#13     2     2 2000     66     2
#14     2     2 2001     67     2
#15     2     2 2002     68     2
#16     2     3 2000     14     1
#17     2     3 2001     15     1
#18     2     3 2002     16     1

data

df <- structure(list(type = c(1L, 1L, 1L, 2L, 2L, 2L), id = c(1L, 2L, 
3L, 1L, 2L, 3L), age2000 = c(20L, 35L, 24L, 32L, 66L, 14L), age2001 = c(21L, 
36L, 25L, 33L, 67L, 15L), age2002 = c(22L, 37L, 26L, 34L, 68L, 
16L), bool2000 = c(1L, 2L, 1L, 2L, 2L, 1L), bool2001 = c(1L, 
2L, 1L, 2L, 2L, 1L), bool2002 = c(1L, 2L, 1L, 2L, 2L, 1L)), 
class = "data.frame", row.names = c(NA, -6L))
...