从嵌套列表中提取特定数据

时间:2020-01-02 06:56:42

标签: r list nested

我正在尝试从IMDB中对2019年电影进行网络抓取。我正在从嵌套列表中提取主任的姓名。 现在,问题是不是为所有电影提供导演的姓名,而是为选定的少数电影提供导演的姓名,因此我需要在出现“导演:\ n”一词的地方提取导演的姓名。

嵌套列表如下:

[[1]]
[1] "Henry Cavill,Freya Allan,Anya Chalotra,Mimi Ndiweni\n"

[[2]]
[1] "\n"                                                          
[2] "Director:\nJ.J. Abrams"                                    
[3] "|"                                                           
[4] "Stars:\nCarrie Fisher,Mark Hamill,Adam Driver,Daisy Ridley\n"

[[3]]
[1] "Pedro Pascal,Carl Weathers,Rio Hackford,Gina Carano\n"

[[4]]
[1] "\n"                                                                       
[2] "Director:\nTom Hooper"                                                    
[3] "|"                                                                        
[4] "Stars:\nFrancesca Hayward,Taylor Swift,Laurie Davidson,Robbie Fairchild\n"

[[5]]
[1] "Guy Pearce,Andy Serkis,Stephen Graham,Joe Alwyn\n"

[[6]]
[1] "\n"                                                                   
[2] "Director:\nMichael Bay"                                              
[3] "|"                                                                    
[4] "Stars:\nRyan Reynolds,Mélanie Laurent,Manuel Garcia-Rulfo,Ben Hardy\n"

在这里可以看到,主任的名字以另一种方式出现,但这只是出于示例目的。预先感谢。

预期输出:

director_data NA,“ J.J。Abrams”,NA,“ Michael Bay”

3 个答案:

答案 0 :(得分:3)

这是基本的R解决方案,您可以在其中使用方法grep + gsub或方法regmatches + gregexpr

假设您的数据是列表lst,那么您可以尝试使用以下代码提取导演姓名:

sapply(lst, function(x) ifelse(length(r <- grep("Director",x,value = T)),gsub("Director:\n","",r),NA))

sapply(lst, function(x) ifelse(length(r<-unlist(regmatches(x,gregexpr("(?<=Director:\n)(.*)",x,perl = T)))),r,NA))

答案 1 :(得分:1)

您可以使用str_extract提取字符串,并使用map遍历列表中的每个元素

library(purrr)
library(stringr)

map_chr(list_df, ~{temp <- na.omit(str_extract(.x, "(?<=Director:\n)(.*)")); 
                   if(length(temp) > 0) temp else NA})

#[1] NA            "J.J. Abrams" NA            "Tom Hooper" 

数据

由于您没有提供可复制的示例,因此我自己创建了一个示例。

list_df <- list("Henry Cavill,Freya Allan,Anya Chalotra,Mimi Ndiweni\n", 
c("\n", "Director:\nJ.J. Abrams", "|", "Stars:\nCarrie Fisher,Mark Hamill,Adam Driver,Daisy Ridley\n"
), "Pedro Pascal,Carl Weathers,Rio Hackford,Gina Carano\n", 
c("\n", "Director:\nTom Hooper", "|", "Stars:\nFrancesca Hayward,Taylor Swift,Laurie Davidson,Robbie Fairchild\n"
))

答案 2 :(得分:1)

Base R解决方案:

directors_data <- gsub("Director:\n", "",

                       unlist(Map(function(x){x[2]}, list_df)), fixed = TRUE)

不使用unlist而不使用mapply而不使用Map的Base R解决方案:

directors_data <- gsub(".*\\\n", "",

                       mapply(function(x){x[2]}, list_df, SIMPLIFY = TRUE))

如果模式在每个列表元素的不同索引处出现,则为Base R解决方案:

directors_data <- gsub(".*\\\n", "",

                       mapply(function(x) {

                         ifelse(length(x[which(grepl("Director", x))]) > 0,

                                x[which(grepl("Director", x))],

                                NA)}, list_df, SIMPLIFY = TRUE))