R 从列表创建数据帧

R 从列表创建数据帧,r,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个向量的列表:

[[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]
这个列表是从一个str_match_all函数创建的,我在一个5行的数据框中使用了这个函数

如何创建一个新的数据框,将这些结果组合成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)

Egencia.input我们可以使用
map

library(tidyverse)
map_df(lst, ~ 
          .x %>%
              as.data.frame %>%
              separate(V2, into = c("V2", "V3"), sep="/")) %>%
  select(-V1)
数据
lst由于您有一个列数相同的矩阵列表,最简单的方法就是
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}))"

city.pair.temp基于您的Eugenia.input,我创建了一个可以一次性处理此问题的工作流。这看起来可能有点复杂,但并没有那么难

首先,我添加了一个id来跟踪记录,接下来我将JFK BOS中的
替换为
/
,因为JFK是从罗马前往波士顿之前的中途停留地。第三,我使用您的正则表达式提取所有机场代码,在第三个变异步骤中,我删除了列表中创建的所有空列。完成此操作后,您可以
unest
路由列表,它充当一种
分隔行
。在此之后,您可以将列拆分为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
库(purrr)
图书馆(dplyr)
图书馆(tidyr)
城市温度%
未测试(路由)%>%
分离(路由,into=c(“从”,“到”))
易信达输出
国内…国际票务。承运商id从到
1国际三角洲1 EWR MIA
2美国国内航空公司2 MIA JFK
3国内三角洲3楼布鲁
4国内德尔塔3布鲁EVN
5国际法航4 FCO JFK
6法国国际航空公司4肯尼迪机场
7法国国际航空公司4 BOS FCO

“纽约(宾夕法尼亚州南部/纽约卡罗尔顿,M)”的条目如果我没有弄错的话,是从纽约到马里兰州新卡罗尔顿的火车旅行。我不确定这是否不应被归类为国内旅行。

请添加您的data.frame和用于获取此输出的代码。可能有比事后进行此修复更好的方法。请参阅如何操作this@phiver增加了数据帧和现有code应要求。
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