r - 如何重塑具有多个级别的数据框
问题描述
我目前有一个格式如下所示的数据框(df1):
ID | F1_1 | F2_1r1 | F2_1r2 | F2_1r3 | F1_2 | F2_2r1 | F2_2r2 | F2_2r3 | F1_3 | F2_3r1 | F2_3r2 | F2_3r3 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 10 | 1 | 1 | 0 | 15 | 0 | 1 | 0 | 30 | 1 | 0 | 0 |
2 | 25 | 1 | 0 | 0 | 30 | 0 | 1 | 1 | 25 | 1 | 0 | 1 |
3 | 40 | 0 | 1 | 0 | 15 | 0 | 1 | 0 | 10 | 0 | 0 | 1 |
4 | 25 | 1 | 1 | 0 | 10 | 0 | 1 | 1 | 30 | 1 | 0 | 0 |
我想重新格式化它,以便按照 df2 中所示的方式排列:
ID | F1_value | R1 | R2 | R3 | F1_x |
---|---|---|---|---|---|
1 | 10 | 1 | 1 | 0 | 1 |
1 | 15 | 0 | 1 | 0 | 2 |
1 | 30 | 1 | 0 | 0 | 3 |
2 | 25 | 1 | 0 | 0 | 1 |
2 | 30 | 0 | 1 | 1 | 2 |
2 | 25 | 1 | 0 | 1 | 3 |
3 | 40 | 0 | 1 | 0 | 1 |
3 | 15 | 0 | 1 | 0 | 2 |
3 | 10 | 0 | 0 | 1 | 3 |
4 | 25 | 1 | 1 | 0 | 1 |
4 | 10 | 0 | 1 | 1 | 2 |
4 | 30 | 1 | 0 | 0 | 3 |
解决方案
您可以使用pivot_longer()
,但如果您先重命名变量,则更容易,如下所示:
x <- data.frame(
ID = 1:4,
A1 = c(10,25,40,25),
A1.1=c(1,1,0,1),
A1.2=c(1,0,1,1),
A1.3=c(0,0,0,0),
B1 = c(15,30,15,10),
B1.1=c(0,0,0,0),
B1.2=c(1,1,1,1),
B1.3=c(0,1,0,1),
C1 = c(30,25,10,30),
C1.1=c(1,1,0,1),
C1.2=c(0,0,0,0),
C1.3=c(0,1,1,0)
)
x %>%
rename("A1.0" = "A1",
"B1.0" = "B1",
"C1.0" = "C1") %>%
pivot_longer(`A1.0`:`C1.3`,
names_pattern=c("([A-C])\\d.(\\d)"),
names_to=c("A_C", ".value"),
names_prefix = "R") %>%
rename("A1_C1_value" = "0",
"R1" = "1",
"R2" = "2",
"R3" = "3")
# # A tibble: 12 × 6
# ID A_C A1_C1_value R1 R2 R3
# <int> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 1 A 10 1 1 0
# 2 1 B 15 0 1 0
# 3 1 C 30 1 0 0
# 4 2 A 25 1 0 0
# 5 2 B 30 0 1 1
# 6 2 C 25 1 0 1
# 7 3 A 40 0 1 0
# 8 3 B 15 0 1 0
# 9 3 C 10 0 0 1
# 10 4 A 25 1 1 0
# 11 4 B 10 0 1 1
# 12 4 C 30 1 0 0**
推荐阅读
- java - OnCreate 中的 PopupWindow 与 ShowAtLocation - 如何获取父视图?
- react-native - 简化样式更改 onPress React Native
- django - 如何使用 django 在后台任务中设置重复间隔时间?
- c# - HttpClient 超时/取消异常
- go - time.Sub() 返回 1 秒,尽管差异超过了几年
- c# - 如何在 C# 中获取 json 属性的特定部分?
- flutter - 在 Flutter 中运行定期后台代码
- javascript - Firebase 初始化应用丢失当前用户
- windows - 如何在 Xampp windows 10 中创建虚拟主机
- python - 模型常量在数据迁移中不可用?