r - 遍历分组的行以获得不同的对组合
问题描述
有下表:
read.table(text = "route origin dest seq
1 a b 1
1 b c 2
1 c d 3
1 d e 4
2 f g 1
2 g h 2
2 h i 3", header = TRUE)
我试图找到一种遍历每一行的方法,按路由分组,并迭代每个可能的起始目的地对组合,同时考虑到 seq 变量和提到的路由。
输出应如下所示:
origin dest
a b
a c
a d
a e
b c
b d
(...) (...)
这背后的想法是火车,例如路线 1,从 a 到 e。但是,我想列出所有可能的火车对。我尝试使用 igraph 但没有成功。dplyr 有什么想法吗?
解决方案
library(dplyr)
library(tidyr)
df %>%
mutate_if(is.factor, as.character) %>% #convert factor variable to character
group_by(route) %>%
expand(origin = paste(origin, seq, sep = "_"), dest = paste(dest, seq, sep = "_")) %>% #all possible combination of origin & destination grouped by route
rowwise() %>%
filter(strsplit(origin, split = "_")[[1]][1] != strsplit(dest, split = "_")[[1]][1] &
strsplit(origin, split = "_")[[1]][2] <= strsplit(dest, split = "_")[[1]][2]) %>%
mutate(origin = gsub("_.*$", "", origin),
dest = gsub("_.*$", "", dest))
输出是:
route origin dest
1 1 a b
2 1 a c
3 1 a d
4 1 a e
5 1 b c
...
样本数据:
df <- structure(list(route = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), origin = structure(1:7, .Label = c("a",
"b", "c", "d", "f", "g", "h"), class = "factor"), dest = structure(1:7, .Label = c("b",
"c", "d", "e", "g", "h", "i"), class = "factor"), seq = c(1L,
2L, 3L, 4L, 1L, 2L, 3L)), class = "data.frame", row.names = c(NA,
-7L))
# route origin dest seq
#1 1 a b 1
#2 1 b c 2
#3 1 c d 3
#4 1 d e 4
#5 2 f g 1
#6 2 g h 2
#7 2 h i 3
推荐阅读
- reactjs - React js:如何解决多个导出?
- sql-server - 根据重复组值获取数据
- android - 即使使用内置的 android studio 应用程序,我也总是在 Android Studio 中收到错误“Prolog 中不允许的内容”
- javascript - 我如何在 cpanel 中运行“npm run dev”我从事 laravel 项目
- python - 试图从文本文档(python)中获取随机行
- javascript - 我正在尝试让一个 div 元素跟随我的鼠标(javascript),但它一直出现故障
- python - 如何拍摄多张图片链接
- sql-server - SOAP UI:获取响应时出错;尝试连接到 Microsoft SQL Server 时为 null
- wso2 - 如何获取列表属性/字段 WSO2 IS
- php - WSDL 中缺少 PHP SOAP xml 命名空间