我是R的入门用户,拥有以下5个向量的列表:
[[1]]
[,1] [,2]
[1,] "" "EWR/MIA"
[[2]]
[,1] [,2]
[1,] "" "MIA/JFK"
[[3]]
[,1] [,2]
[1,] "" "FLR/BRU"
[2,] "" "BRU/EVN"
[[4]]
[,1] [,2]
[1,] "" "FCO/JFK"
[2,] "" "BOS/FCO"
[[5]]
[,1] [,2]
此列表是根据我在5行数据框中使用的str_match_all函数创建的。
如何创建一个将这些结果合并为6行的新数据框?此外,我希望能够将每个结果分成两列(例如,第1列中的EWR和第2列中的MIA)。
谢谢!
编辑:这是我的数据框:
> dput(Egencia.input)
structure(list(Domestic...International = structure(c(2L, 1L,
1L, 2L, 2L), .Label = c("Domestic", "International"), class = "factor"),
Ticketing.carrier = structure(c(3L, 2L, 3L, 1L, 1L), .Label = c("Air France",
"American Airlines", "Delta"), class = "factor"), Routing = structure(c(1L,
4L, 3L, 2L, 5L), .Label = c("EWR/MIA", "FCO/JFK_BOS/FCO",
"FLR/BRU/EVN", "MIA/JFK", "New York (Penn S/New Carrollton,M"
), class = "factor")), row.names = c(NA, -5L), class = "data.frame")
我正在使用的代码:
Egencia.input <- read.csv("/Users/nliusont/Documents/NYU/R/test2.csv", header=T)
city.pair.temp <- "(?=([A-Z]{3}/[A-Z]{3}))"
city.pairs <- str_match_all(Egencia.input$Routing, city.pair.temp)
答案 0 :(得分:0)
我们可以使用map
library(tidyverse)
map_df(lst, ~
.x %>%
as.data.frame %>%
separate(V2, into = c("V2", "V3"), sep="/")) %>%
select(-V1)
lst <- list(cbind("", "EWR/MIA"), cbind("", "MIA/JFK"),
cbind(c("", ""), c("FLR/BRU", "BRU/EVN")))
答案 1 :(得分:0)
由于您拥有具有相同列数的矩阵列表,所以最简单的方法就是rbind
:
result = do.call(rbind, city.pairs)
模式do.call(f, list(a, b, c))
是写f(a, b, c)
的另一种方式。由于您具有列表,因此需要使用do.call
而不是直接调用。
此外,我希望能够将每个结果分成两列
然后调整正则表达式:
city.pair.temp <- "(?=([A-Z]{3})/([A-Z]{3}))"
这样,在斜杠之前和之后,您将获得两个单独的匹配组。
答案 2 :(得分:0)
根据您的Eugenia.input,我创建了一个可以一次性处理的工作流。它可能看起来有点复杂,但并不难。
首先,我添加了一个ID来跟踪记录,接下来,我将JFK_BOS中的_
替换为/
,因为JFK是从罗马前往波士顿之前的中途停留。第三,我使用您的正则表达式提取所有机场代码,在第三个mutate步骤中,我删除了列表中创建的所有空列。完成此操作后,您可以unnest
充当“ separate_rows
”的路由列表。之后,您可以将列拆分为from和to。
library(purrr)
library(dplyr)
library(tidyr)
city.pair.temp <- "(?=([A-Z]{3})/([A-Z]{3}))"
Egencia.output <- Egencia.input %>%
mutate(id = row_number(),
Routing = stringr::str_replace(Routing, "_", "/"),
Routing = stringr::str_match_all(Routing, city.pair.temp),
Routing = map(Routing, function(x) x[x != ""])) %>%
unnest(Routing) %>%
separate(Routing, into = c("from", "to"))
Egencia.output
Domestic...International Ticketing.carrier id from to
1 International Delta 1 EWR MIA
2 Domestic American Airlines 2 MIA JFK
3 Domestic Delta 3 FLR BRU
4 Domestic Delta 3 BRU EVN
5 International Air France 4 FCO JFK
6 International Air France 4 JFK BOS
7 International Air France 4 BOS FCO
如果我没记错的话,“纽约(Penn S / New Carrollton,M“)的条目是从纽约到马里兰州新卡罗尔顿的火车旅程。我不确定是否应该归类为国内旅行。