是否有R函数等效于Python中的range?

时间:2019-08-27 02:19:42

标签: r string stringr

我正在将字符串拆分为3个字符的ngram,例如HelloWorld会变成“ Hel”,“ ell”,“ llo”,“ loW”等 我将如何使用R

实现此目标

在Python中,使用range函数会产生一个循环-例如[myString [i:] for i in range(3)])

是否有一种巧妙的方法可以使用Stringr(另一个合适的函数/包)遍历字符串的字母,将单词标记为向量?

例如

dfWords <- c("HelloWorld", "GoodbyeMoon", "HolaSun") %>% data.frame() names(dfWords)[1] = "Text"

我想生成一个新列,其中包含标记化Text变量的向量(最好使用dplyr)。然后可以将其拆分为新列。

1 个答案:

答案 0 :(得分:4)

在基数R中,您可以执行以下操作

ss <- "HelloWorld"

len <- 3
lapply(seq_len(nchar(ss) - len + 1), function(x) substr(ss, x, x + len - 1))
#[[1]]
#[1] "Hel"
#
#[[2]]
#[1] "ell"
#
#[[3]]
#[1] "llo"
#
#[[4]]
#[1] "loW"
#
#[[5]]
#[1] "oWo"
#
#[[6]]
#[1] "Wor"
#
#[[7]]
#[1] "orl"
#
#[[8]]
#[1] "rld"

说明:该方法是一种基本的滑动窗口方法,用于从substr中提取ss个元素。返回对象是list


另一种(滑动窗口)替代方法可以是zoo::rollapplystrsplit

library(zoo)
len <- 3
rollapply(unlist(strsplit(ss, "")), len, paste, collapse = "")
[1] "Hel" "ell" "llo" "loW" "oWo" "Wor" "orl" "rld"

为回应您的评论/编辑,这是一个tidyverse选项

# Sample data
df <- data.frame(words = c("HelloWorld", "GoodbyeMoon", "HolaSun"))

library(tidyverse)
library(zoo)
df %>% mutate(lst = map(str_split(words, ""), function(x) rollapply(x, len, paste, collapse = "")))
#        words                                         lst
#1  HelloWorld      Hel, ell, llo, loW, oWo, Wor, orl, rld
#2 GoodbyeMoon Goo, ood, odb, dby, bye, yeM, eMo, Moo, oon
#3     HolaSun                     Hol, ola, laS, aSu, Sun