首页 > 解决方案 > 如何用重复的分隔符分割字符串?

问题描述

我有以下格式的电影名称列表:

电影名称
Ace Ventura: When Nature Calls (1995)

十二只猴子(又名 12 只猴子)(1995 年)

七(又名 Se7en)(1995)

French Twist (Gazon maudit) (1995)

布朗克斯的隆隆声 (Hont faan kui) (1995)

我正在尝试拆分年份并形成一个新列。

数据。
注:由用户 Rui Barradas 编辑

x <- scan(what = character(), text = '
"Ace Ventura: When Nature Calls (1995)"
"Twelve Monkeys (a.k.a. 12 Monkeys) (1995)"
"Seven (a.k.a. Se7en) (1995)"
"French Twist (Gazon maudit) (1995)"
"Rumble in the Bronx (Hont faan kui) (1995)"
')

标签: rregex

解决方案


您可以使用separate()包的功能tidyr通过所需的分隔符拆分 data.frame 中的列。

正如其他人所说,您可以使用正则表达式来查找数据中的模式。下面我用来(?=\\(\\d{4}\\))在括号内查找 4 位数字的模式(并将其设置为分隔符)。您可以将其与积极的前瞻 ?=结合起来寻找模式,但保留它以供以后使用。

# load package tidyr
require(tidyr)

# your data
x <- scan(what = character(), text = '
"Ace Ventura: When Nature Calls (1995)"
"Twelve Monkeys (a.k.a. 12 Monkeys) (1995)"
"Seven (a.k.a. Se7en) (1995)"
"French Twist (Gazon maudit) (1995)"
"Rumble in the Bronx (Hont faan kui) (1995)"
')

# to data.frame
x <- as.data.frame(x)

# split by delimiter (4 digits within parenthesis)
# and create two columns - movie name and year
x <- separate(x, col = x, into = c('movie', 'year'), 
         sep = "(?=\\(\\d{4}\\))")

输出

> x
                                 movie   year
1      Ace Ventura: When Nature Calls  (1995)
2  Twelve Monkeys (a.k.a. 12 Monkeys)  (1995)
3                Seven (a.k.a. Se7en)  (1995)
4         French Twist (Gazon maudit)  (1995)
5 Rumble in the Bronx (Hont faan kui)  (1995)

如果您愿意,您可以稍后去掉年份列中的括号。

x$year <- gsub("[\\(|\\)]", "", x$year)

> x
                                 movie year
1      Ace Ventura: When Nature Calls  1995
2  Twelve Monkeys (a.k.a. 12 Monkeys)  1995
3                Seven (a.k.a. Se7en)  1995
4         French Twist (Gazon maudit)  1995
5 Rumble in the Bronx (Hont faan kui)  1995

推荐阅读