我有一个大向量x
(~200k
个元素),其中每个元素都是逗号分隔的字符串。我还有一个小的查找表lkp
,它将旧字符串Map到新字符串。为了这个例子,让我们假设这只是一个命名向量。
我想做的是:
1.我想将x
中的每个元素拆分为它的标记
1.在lkp的帮助下替换令牌
1.从替换中删除重复项并排序
一个相当直接的实现看起来像这样:
library(stringr)
x <- c("a,b,c", "c", "b,c", "a,b")
lkp <- c(a = "A", b = "A", c = "B")
tokens <- str_split(x, fixed(","))
lapply(tokens, \(t) sort(unique(lkp[t])))
# [[1]]
# [1] "A" "B"
# [[2]]
# [1] "B"
# [[3]]
# [1] "A" "B"
# [[4]]
# [1] "A"
字符集
我观察到,虽然str_split
非常快,但lapply
可能需要相当长的时间:
library(tictoc)
xbig <- x[sample(length(x), 2e6, TRUE)]
tic("str_split")
tokens <- str_split(xbig, fixed(","))
toc()
# str_split: 0.89 sec elapsed
tic("lapply")
res <- lapply(tokens, \(t) sort(unique(lkp[t])))
toc()
# lapply: 60.33 sec elapsed
型
所以我想知道,是否有更聪明的方法来利用矢量化?
如果去掉唯一性和排序属性,更好的方法是
tic("split")
res <- split(lkp[unlist(tokens)], rep(seq_along(tokens), lengths(tokens)))
toc()
# split: 2.89 sec elapsed
型
所以我想知道(考虑到str_split
的超快速度)是否有一个regex
解决方案可以从stringr
的速度中受益?
1条答案
按热度按时间ghhkc1vu1#
我们可以用
str_replace_all
利用命名向量lkp
进行就地替换。1.使用
str_split
在逗号上分割数据。1.获取唯一值。
字符集
在更大的向量上。
型
这个时间比你现在的时间要好,但是我认为第2步和第3步可以一步解决,而不需要使用正则表达式来分割字符串,但是现在还不能找到合适的正则表达式。