R:从“宽”重塑为“长”,保持一些变量“宽”

BoT*_*oTz 1 r

我有宽格式的数据文件,带有一组重复变量(var1 var2,如下)

数据有:

| ID | background vars| var1.A | var2.A | var1.B | var2.B | var1.C | var2.C |
| -: | :------------- |:------:|:------:|:------:|:------:|:------:|:------:|
| 1  |  data1         | 1      | 2      | 3      | 4      | 5      | 6      | 
| 2  |  data2         | 7      | 8      | 9      | 10     | 11     | 12     |
Run Code Online (Sandbox Code Playgroud)

我需要将其“半途”重塑为长格式,即将每个变量组放在一起(宽),并将每个重复放在不同的行(长)中。

想要的数据:

| ID | background vars | recurrence | var1   | var2   |
| -: | :-------------- |:----------:|:------:|:------:|
| 1  |  data1          | A          | 1      | 2      |
| 1  |  data1          | B          | 3      | 4      |
| 1  |  data1          | C          | 5      | 6      |
| 2  |  data2          | A          | 7      | 8      |
| 2  |  data2          | B          | 9      | 10     |
| 2  |  data2          | C          | 11     | 12     |
Run Code Online (Sandbox Code Playgroud)

我使用 reshape() Gather() 和 Melt() 找到了一些解决方案。然而,所有这些都会将所有变量折叠为长格式,并且不允许某些变量保持“宽”)。

如何使用 R 以这种方式塑造数据?

All*_*ron 7

'.value'在参数中使用关键字names_to可将列名的该部分保留为宽格式:

tidyr::pivot_longer(df, c(-ID, -`background vars`),
                    names_sep = '\\.', 
                    names_to = c('.value', 'recurrence'))
#> # A tibble: 6 x 5
#>      ID `background vars` recurrence  var1  var2
#>   <int> <chr>             <chr>      <int> <int>
#> 1     1 data1             A              1     2
#> 2     1 data1             B              3     4
#> 3     1 data1             C              5     6
#> 4     2 data2             A              7     8
#> 5     2 data2             B              9    10
#> 6     2 data2             C             11     1
Run Code Online (Sandbox Code Playgroud)