如何最有效地融合具有多个测量列组的 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
我有一个以下形式的数据框:
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