如何最有效地融合具有多个测量列组的 data.frame

How to most efficiently melt a data.frame with multiple measured column groups

我有一个以下形式的数据框:

df <- data.frame("id_1" = seq(1,100, 1),
                 "id_2" = seq(1,100, 1),
                 "id_3" = seq(1,100, 1),
                 "m1_g1" = seq(1,100, 1),
                 "m2_g1" = seq(2,200, 2),
                 "m3_g2" = seq(3,300, 3),
                 "m4_g2" = seq(4,400, 4))

我想融化它,以便 id 列用作 id,但是我实际上每个原始条目有 2 行显示 m1-m4 列,其中 m1-m2 具有相同的度量类型(g1 ) 和 m3-m4 是另一种度量类型 (g2)

最终数据框如下所示:

   id_1    id_2    id_3   var   value_1    value_2
1    1       1       1     1       1           3
2    1       1       1     2       2           4
3    2       2       2     1       2           6
4    2       2       2     2       4           8

我试过使用 melt 创建单独的融化数据框,然后粘贴到列上,但我觉得必须有更好的方法。

谢谢大家!


使用tidyr,我们可以在一个枢轴上完成,但是我们需要先重命名其中的一些,这样领先的m*_就不那么不同了。

library(dplyr)
library(tidyr) # pivot_longer
rename(df, m1_g2 = m3_g2, m2_g2 = m4_g2) %>%
  pivot_longer(-starts_with("id"), names_pattern = "m(.*)_g(.*)", names_to = c("val", ".value"))
# # A tibble: 200 x 6
#     id_1  id_2  id_3 val     `1`   `2`
#    <dbl> <dbl> <dbl> <chr> <dbl> <dbl>
#  1     1     1     1 1         1     3
#  2     1     1     1 2         2     4
#  3     2     2     2 1         2     6
#  4     2     2     2 2         4     8
#  5     3     3     3 1         3     9
#  6     3     3     3 2         6    12
#  7     4     4     4 1         4    12
#  8     4     4     4 2         8    16
#  9     5     5     5 1         5    15
# 10     5     5     5 2        10    20
# # ... with 190 more rows