【发布时间】:2022-01-16 13:22:25
【问题描述】:
我有一个名称列表(著名导演),格式为“名”(可能是中间名)和“姓氏”,我需要将其重新排列为姓氏,名次(可能是中间名)。我不能将所有这些都用第一个空格甚至第二个空格分开,因为有些姓氏实际上有两个单词,有些有中间名和/或中间名首字母,它们会留在名字后面。
这是我正在使用的列表的 dput:
> dput(directors.names)
c("Frank Darabont,", "Francis Ford Coppola,", "Francis Ford Coppola,",
"Christopher Nolan,", "Sidney Lumet,", "Steven Spielberg,", "Peter Jackson,",
"Quentin Tarantino,", "Sergio Leone,", "Peter Jackson,", "David Fincher,",
"Robert Zemeckis,", "Christopher Nolan,", "Peter Jackson,", "Irvin Kershner,",
"Lana Wachowski,", "Martin Scorsese,", "Milos Forman,", "Akira Kurosawa,",
"David Fincher,", "Jonathan Demme,", "Fernando Meirelles,", "Roberto Benigni,",
"Frank Capra,", "Steven Spielberg,", "George Lucas,", "Christopher Nolan,",
"Hayao Miyazaki,", "Frank Darabont,", "Bong Joon Ho,", "Luc Besson,",
"Masaki Kobayashi,", "Roman Polanski,", "James Cameron,", "Robert Zemeckis,",
"Bryan Singer,", "Alfred Hitchcock,", "Roger Allers,", "Charles Chaplin,",
"Tony Kaye,", "Isao Takahata,", "Charles Chaplin,", "Damien Chazelle,",
"Ridley Scott,", "Martin Scorsese,", "Olivier Nakache,", "Christopher Nolan,",
"Michael Curtiz,", "Sergio Leone,", "Alfred Hitchcock,", "Giuseppe Tornatore,",
"Ridley Scott,", "Francis Ford Coppola,", "Christopher Nolan,",
"Steven Spielberg,", "Charles Chaplin,", "Quentin Tarantino,",
"Florian Henckel von Donnersmarck,", "Stanley Kubrick,", "Billy Wilder,",
"Andrew Stanton,", "Anthony Russo,", "Billy Wilder,", "Stanley Kubrick,",
"Bob Persichetti,", "Stanley Kubrick,", "Hayao Miyazaki,", "Park Chan-Wook,",
"Todd Phillips,", "Makoto Shinkai,", "Lee Unkrich,", "Christopher Nolan,",
"James Cameron,", "Sergio Leone,", "Anthony Russo,", "Nadine Labaki,",
"Wolfgang Petersen,", "Akira Kurosawa,", "Rajkumar Hirani,",
"John Lasseter,", "Sam Mendes,", "Milos Forman,", "Mel Gibson,",
"Quentin Tarantino,", "Thomas Kail,", "Gus Van Sant,", "Richard Marquand,",
"Stanley Kubrick,", "Quentin Tarantino,", "Elem Klimov,", "Fritz Lang,",
"Aamir Khan,", "Alfred Hitchcock,", "Orson Welles,", "Thomas Vinterberg,",
"Darren Aronofsky,", "Stanley Donen,", "Alfred Hitchcock,", "Michel Gondry,",
"Akira Kurosawa,", "Vittorio De Sica,", "David Lean,", "Charles Chaplin,",
"Stanley Kubrick,", "Nitesh Tiwari,", "Billy Wilder,", "Denis Villeneuve,",
"Florian Zeller,", "Fritz Lang,", "Billy Wilder,", "Stanley Kubrick,",
"Martin Scorsese,", "Asghar Farhadi,", "George Roy Hill,", "Brian De Palma,",
"Satyajit Ray,", "Guy Ritchie,", "Sam Mendes,", "Jean-Pierre Jeunet,",
"Robert Mulligan,", "Lee Unkrich,", "Sergio Leone,", "Pete Docter,",
"Steven Spielberg,", "Michael Mann,", "Curtis Hanson,", "T.J. Gnanavel,",
"Akira Kurosawa,", "John McTiernan,", "Akira Kurosawa,", "Akira Kurosawa,",
"Peter Farrelly,", "Oliver Hirschbiegel,", "Terry Gilliam,",
"Joseph L. Mankiewicz,", "Billy Wilder,", "Christopher Nolan,",
"Clint Eastwood,", "Majid Majidi,", "Hayao Miyazaki,", "Martin Scorsese,",
"Stanley Kramer,", "John Sturges,", "Paul Thomas Anderson,",
"Martin Scorsese,", "John Huston,", "Guillermo del Toro,", "Ron Howard,",
"Juan José Campanella,", "Martin Scorsese,", "Akira Kurosawa,",
"Roman Polanski,", "Hayao Miyazaki,", "Guy Ritchie,", "Martin Scorsese,",
"Ethan Coen,", "Charles Chaplin,", "Alfred Hitchcock,", "John Carpenter,",
"Ingmar Bergman,", "Martin McDonagh,", "Sergio Pablos,", "David Lynch,",
"M. Night Shyamalan,", "Ingmar Bergman,", "Peter Weir,", "Carol Reed,",
"Steven Spielberg,", "Denis Villeneuve,", "Bong Joon Ho,", "James McTeigue,",
"Ridley Scott,", "Danny Boyle,", "Pete Docter,", "David Lean,",
"Joel Coen,", "Gavin O'Connor,", "Andrew Stanton,", "Quentin Tarantino,",
"Victor Fleming,", "Yasujirô Ozu,", "Elia Kazan,", "Cagan Irmak,",
"Damián Szifron,", "Andrei Tarkovsky,", "Michael Cimino,", "Denis Villeneuve,",
"Costa-Gavras,", "Wes Anderson,", "Buster Keaton,", "Clyde Bruckman,",
"Clint Eastwood,", "Ingmar Bergman,", "Richard Linklater,", "Adam Elliot,",
"Steven Spielberg,", "Frank Capra,", "Jim Sheridan,", "Stanley Kubrick,",
"Lenny Abrahamson,", "David Fincher,", "Mel Gibson,", "Carl Theodor Dreyer,",
"Sriram Raghavan,", "James Mangold,", "Steve McQueen,", "Ernst Lubitsch,",
"Joel Coen,", "Peter Weir,", "Ingmar Bergman,", "Dean DeBlois,",
"George Miller,", "William Wyler,", "David Yates,", "Clint Eastwood,",
"Henri-Georges Clouzot,", "Park Chan-Wook,", "Rob Reiner,", "Sidney Lumet,",
"James Mangold,", "Anurag Kashyap,", "Stuart Rosenberg,", "Lasse Hallström,",
"Mathieu Kassovitz,", "François Truffaut,", "Naoko Yamada,",
"Oliver Stone,", "Tom McCarthy,", "Pete Docter,", "Alfred Hitchcock,",
"Terry Jones,", "Terry George,", "Kar-Wai Wong,", "Yavuz Turgul,",
"Ron Howard,", "Sean Penn,", "John G. Avildsen,", "Alejandro G. Iñárritu,",
"Hayao Miyazaki,", "Andrei Tarkovsky,", "Frank Capra,", "Richard Linklater,",
"Ingmar Bergman,", "Hideaki Anno,", "Gillo Pontecorvo,", "Federico Fellini,",
"Rob Reiner,", "Wim Wenders,", "Krzysztof Kieslowski,", "Ram Kumar,"
)
一些棘手的例子,我需要在 G. 之后拆分“John G. Avildsen”,然后在第一个空格之后拆分“Bong Joon Ho”,更重要的是,在之后拆分“Florian Henckel von Donnersmarck”第二个空格(只是指出一对)。
我在所有字符串的末尾添加了一个逗号,这样我就可以转置字符串并让它返回姓氏,第一个(可能是中间)格式。
我浏览了我的列表,发现所有需要保留姓氏部分的东西才能尝试的情况,这些情况首先拆分,但它并没有在我需要的地方拆分,它只是在拆分每个字符串到它自己的索引中。
这是我最近尝试过的:
directors.names <- paste0(directors.1, ",")
directors.names <- strsplit(directors.names, "[[:space:]]+('von'|'Ford'|'Joon'|'De'|'del'|'Van')[[:space:]]+", perl = TRUE)
一旦这些被正确拆分和转置,就需要删除重复项以返回一个列表,该列表可以按姓氏字母顺序排序,每行显示姓氏、名字(MI 或中间名)。
【问题讨论】:
-
请与
dput()分享您的数据 -
我编辑了原始问题以添加到我正在使用的列表的
dput()中。
标签: r duplicates transpose strsplit