从列表创建数据框

时间:2018-07-05 15:18:00

标签: 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行数据框中使用的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)

3 个答案:

答案 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“)的条目是从纽约到马里兰州新卡罗尔顿的火车旅程。我不确定是否应该归类为国内旅行。