【问题标题】:How to find find the next space after N characters in an R character vector?如何在 R 字符向量中找到 N 个字符后的下一个空格?
【发布时间】:2018-09-24 06:56:28
【问题描述】:

我有一些不同长度的大字符向量,我需要将它们分成更小的长度以便在 spacyr 中进行处理。我目前在 lapply() 中使用 substr() 拆分为一个列表,其中每个列表项的长度为 500K 个字符。

但是,我想在大约 500K 个字符后分割下一个空格,以避免将一个单词切成两半。不知道如何修改我到目前为止的想法。我当前的代码有点像这样:

#Pretend 'text' is my list of words
chars = c(letters, " ", ".")
text<-paste0(sample(chars, 3000000, replace=TRUE), collapse="")

#split to list of smaller vectors
text_segments<-laply(seq(1,nchar(text),500000), function(i) substr(text, i, i+499999))

#do something with each
for(i in unique(text_segments)){
parsedtxt <- spacy_parse(i)
...
}

上例中的每个假单词都是 3 个字母长,但在我的真实文件中,单词的长度各不相同。

任何有关解决空间问题的建议将不胜感激。代码速度不是问题,但我确实很欣赏效率方面的建议。

【问题讨论】:

  • 请添加您的数据样本和您希望输出的样例,以便可以重现此问题...现在,没有人可以在自己的会话中运行它,所以它是很难帮你。谢谢:)
  • 我刚刚在原始问题中添加了一个假样本。

标签: r string loops vector char


【解决方案1】:

也许您可以从下面的代码中获得灵感,并将其适应您的数据集。
首先我会补一些数据。

set.seed(1)    # Make the results reproducible
y1 <- paste(sample(c(letters, " "), 1e3, TRUE), collapse = "")
y2 <- paste(sample(c(letters, " "), 1e3, TRUE), collapse = "")
str_list <- list(y1, y2)

现在,fun 函数完成了这项工作。它使用gregexpr 获取空格的位置,然后返回从输入字符串的开头到找到的第一个空格的所有内容。

fun <- function(x, threshold){
    blanks <- gregexpr(" +", x)[[1]]
    substr(x, 1, blanks[which(blanks > threshold)[1]] - 1)
}

thresh <- 100

sub <- lapply(str_list, fun, thresh)
lapply(sub, nchar)
#[[1]]
#[1] 103
#
#[[2]]
#[1] 154

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2014-06-18
    • 1970-01-01
    相关资源
    最近更新 更多