我有一个包含字母和数字的字符串的列。字符串总是以一个或两个数字开头,后面是多个字符。我试图根据第一个字符的位置来分隔字符串。
have <-
tribble(
~string,
'12main',
'6six',
'42go',
'5to9'
)
want <-
tribble(
~prefix, ~rest,
'12', 'main',
'6', 'six',
'42', 'go',
'5', 'to9'
)
我相信有一个正则表达式与separate
解决方案,但有麻烦让它工作。
want <-
have %>%
separate(string,
into = c('prefix', 'rest'),
sep = "(?=[0-9])(?<=[a-zA-Z])")
2条答案
按热度按时间lndjwyie1#
你已经很接近了,我们可以通过一个look-behind(对于数字)和一个look-ahead(对于非数字)来实现它:
我觉得你把事情想反了
?<=
用于前面的字符串(应与[0-9]
一起使用),?=
用于后面的字符串(应与[^0-9]
或[A-Za-z]
一起使用)。我个人觉得这有点耐人寻味:我们基于0长度模式拆分字符串:在前一个是数字而后一个是非数字的情况下,两者之间没有任何关系,因此拆分实际上是0长度。
仅供参考,如果字符串中有两个这样的位置,例如
5to9to5
,则会出现警告:这是一个警告,你正在丢弃一些信息,如果你想/需要防范这一点,就交给你了。
另一种选择是,因为你的真实的数据中有
5to9to5
:如果你想的话,你现在可以删除
string
。另一个注意事项:如果您打算将
prefix
转换为整数或数字,则可以通过使用list(prefix=0L, rest="")
(或仅使用=0
)来排除这种需要。这是proto=
参数,虽然它的 data 被丢弃,但它用于每个结果列的名称和目标类。xyhw6mcr2#
也可以使用
extract