R:按 1 列熔化数据框并堆叠具有相同名称模式的其他列
R: Melt dataframe by 1 column and stack the other columns that have the same name patterns
我有这种简化的数据情况:
df <- data.frame(Year = 1:3,
A.x = 4:6,
A.y = 7:9,
A.z = 10:12,
B.x = 4:6,
B.y = 7:9,
B.z = 10:12,
C.x = 4:6,
C.y = 7:9,
C.z = 10:12)
我的目标是:
df_goal <- data.frame(Year = rep(1:3, each = 3),
x = rep(4:6, each = 3),
y = rep(7:9, each = 3),
z = rep(10:12, each = 3))
请注意,这些值是任意的,只有列名称、模式和目标年份的顺序很重要。
我试图“手动”创建目标数据框,例如:列 i 包含从位置 x 到 z原始数据集。但它看起来真的很笨拙,因为我正在处理的数据非常庞大。有没有更好的方法可以更系统地重塑数据?
非常感谢!
我们可以使用pivot_longer
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = -Year, names_to = ".value",
names_pattern = "^[^.]+\.(.*)")
# A tibble: 9 × 4
Year x y z
<int> <int> <int> <int>
1 1 4 7 10
2 1 4 7 10
3 1 4 7 10
4 2 5 8 11
5 2 5 8 11
6 2 5 8 11
7 3 6 9 12
8 3 6 9 12
9 3 6 9 12
我有这种简化的数据情况:
df <- data.frame(Year = 1:3,
A.x = 4:6,
A.y = 7:9,
A.z = 10:12,
B.x = 4:6,
B.y = 7:9,
B.z = 10:12,
C.x = 4:6,
C.y = 7:9,
C.z = 10:12)
我的目标是:
df_goal <- data.frame(Year = rep(1:3, each = 3),
x = rep(4:6, each = 3),
y = rep(7:9, each = 3),
z = rep(10:12, each = 3))
请注意,这些值是任意的,只有列名称、模式和目标年份的顺序很重要。
我试图“手动”创建目标数据框,例如:列 i 包含从位置 x 到 z原始数据集。但它看起来真的很笨拙,因为我正在处理的数据非常庞大。有没有更好的方法可以更系统地重塑数据?
非常感谢!
我们可以使用pivot_longer
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = -Year, names_to = ".value",
names_pattern = "^[^.]+\.(.*)")
# A tibble: 9 × 4
Year x y z
<int> <int> <int> <int>
1 1 4 7 10
2 1 4 7 10
3 1 4 7 10
4 2 5 8 11
5 2 5 8 11
6 2 5 8 11
7 3 6 9 12
8 3 6 9 12
9 3 6 9 12