r - r 使用所有组合将数据集从长转换为宽
问题描述
假设这是我的数据集。
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 行 - 第 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
推荐阅读
- javascript - 无论鼠标悬停如何,始终显示工具提示
- javascript - 将数据库和服务器添加到 javascript 引擎
- xamarin - 无法在 Xamarin Forms 中安装应用程序?
- symfony - 在 Symfony 中为 Bootstrap 复选框渲染带有变量的翻译
- haskell - 理解 Haskell 中的 let 表达式
- mysql - 将时间戳转换为 MYSQL_TIME
- python - 如何修复 PyCharm 中未解决的参考“vPython”?
- html - 本地文件系统中的视频不会从同级文件夹播放
- javascript - 使用应用脚本在确定列的最后一行插入值
- visual-studio - 为什么 Microsoft Visual Studio 一直忽略对代码所做的更改,我该如何解决?