R 从列表创建数据帧
我是一个新手,拥有5个向量的列表: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] 这个列
[[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