r 使用所有组合将数据集从长转换为宽
r transform dataset from long to wide with all combinations
假设这是我的数据集。
Type Drat Qsec Wt
Mazda 3.9 16.46 2.620
Toyota 3.85 17.02 2.875
Ford 3.15 3.44 17.02
Duster 3.21 15.84 18.3
我有兴趣将此数据集转换为这样的格式
Type.x Drat.x Qsec.x Wt.x Type.y Drat.y Qsec.y Wt.y
Mazda 3.9 16.46 2.620 Toyota 3.85 17.02 2.875
Mazda 3.9 16.46 2.620 Ford 3.15 3.44 17.02
Mazda 3.9 16.46 2.620 Duster 3.21 15.84 18.3
Toyota 3.85 17.02 2.875 Ford 3.15 3.44 17.02
Toyota 3.85 17.02 2.875 Duster 3.21 15.84 18.3
Ford 3.15 3.44 17.02 Duster 3.21 15.84 18.3
第 1 行 - 第 2 行
第 1 行 - 第 3 行
第 1 行 - 第 4 行
第 2 行 - 第 3 行
第 2 行 - 第 4 行
第 3 行 - 第 4 行
我不太清楚如何有效地做到这一点。非常感谢任何建议。
假设您的数据框名为 df
;我创建了一个这样的示例 df:
df <- mtcars[2:5,c("drat","qsec","wt")]
df$Type <- rownames(df)
> df
drat qsec wt Type
Mazda RX4 Wag 3.90 17.02 2.875 Mazda RX4 Wag
Datsun 710 3.85 18.61 2.320 Datsun 710
Hornet 4 Drive 3.08 19.44 3.215 Hornet 4 Drive
Hornet Sportabout 3.15 17.02 3.440 Hornet Sportabout
我们可以将 dplyr
用于一系列组合、转换和连接。
library(dplyr)
t(combn(df$Type,2)) %>%
as.data.frame() %>%
rename(Type.x = V1,Type.y = V2) %>%
inner_join(df,by = c("Type.x" = "Type")) %>%
inner_join(df,by = c("Type.y" = "Type"))
Type.x Type.y drat.x qsec.x wt.x drat.y qsec.y wt.y
1 Mazda RX4 Wag Datsun 710 3.90 17.02 2.875 3.85 18.61 2.320
2 Mazda RX4 Wag Hornet 4 Drive 3.90 17.02 2.875 3.08 19.44 3.215
3 Mazda RX4 Wag Hornet Sportabout 3.90 17.02 2.875 3.15 17.02 3.440
4 Datsun 710 Hornet 4 Drive 3.85 18.61 2.320 3.08 19.44 3.215
5 Datsun 710 Hornet Sportabout 3.85 18.61 2.320 3.15 17.02 3.440
6 Hornet 4 Drive Hornet Sportabout 3.08 19.44 3.215 3.15 17.02 3.440
假设这是我的数据集。
Type Drat Qsec Wt
Mazda 3.9 16.46 2.620
Toyota 3.85 17.02 2.875
Ford 3.15 3.44 17.02
Duster 3.21 15.84 18.3
我有兴趣将此数据集转换为这样的格式
Type.x Drat.x Qsec.x Wt.x Type.y Drat.y Qsec.y Wt.y
Mazda 3.9 16.46 2.620 Toyota 3.85 17.02 2.875
Mazda 3.9 16.46 2.620 Ford 3.15 3.44 17.02
Mazda 3.9 16.46 2.620 Duster 3.21 15.84 18.3
Toyota 3.85 17.02 2.875 Ford 3.15 3.44 17.02
Toyota 3.85 17.02 2.875 Duster 3.21 15.84 18.3
Ford 3.15 3.44 17.02 Duster 3.21 15.84 18.3
第 1 行 - 第 2 行
第 1 行 - 第 3 行
第 1 行 - 第 4 行
第 2 行 - 第 3 行
第 2 行 - 第 4 行
第 3 行 - 第 4 行
我不太清楚如何有效地做到这一点。非常感谢任何建议。
假设您的数据框名为 df
;我创建了一个这样的示例 df:
df <- mtcars[2:5,c("drat","qsec","wt")]
df$Type <- rownames(df)
> df
drat qsec wt Type
Mazda RX4 Wag 3.90 17.02 2.875 Mazda RX4 Wag
Datsun 710 3.85 18.61 2.320 Datsun 710
Hornet 4 Drive 3.08 19.44 3.215 Hornet 4 Drive
Hornet Sportabout 3.15 17.02 3.440 Hornet Sportabout
我们可以将 dplyr
用于一系列组合、转换和连接。
library(dplyr)
t(combn(df$Type,2)) %>%
as.data.frame() %>%
rename(Type.x = V1,Type.y = V2) %>%
inner_join(df,by = c("Type.x" = "Type")) %>%
inner_join(df,by = c("Type.y" = "Type"))
Type.x Type.y drat.x qsec.x wt.x drat.y qsec.y wt.y
1 Mazda RX4 Wag Datsun 710 3.90 17.02 2.875 3.85 18.61 2.320
2 Mazda RX4 Wag Hornet 4 Drive 3.90 17.02 2.875 3.08 19.44 3.215
3 Mazda RX4 Wag Hornet Sportabout 3.90 17.02 2.875 3.15 17.02 3.440
4 Datsun 710 Hornet 4 Drive 3.85 18.61 2.320 3.08 19.44 3.215
5 Datsun 710 Hornet Sportabout 3.85 18.61 2.320 3.15 17.02 3.440
6 Hornet 4 Drive Hornet Sportabout 3.08 19.44 3.215 3.15 17.02 3.440