R 中是否有相当于 Python 中 range 的函数?

Bri*_*Pom 13 string r stringr

我希望将一个字符串拆分为 3 个字符的 ngram - 例如 HelloWorld 将变为“Hel”、“ell”、“llo”、“loW”等 我如何使用 R 来实现这一点?

在Python中,它需要使用范围函数进行循环 - 例如[myString[i:] for i in range(3)]

有没有一种巧妙的方法可以使用循环遍历字符串的字母stringr将单词标记为向量?

例如

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

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

Jar*_*děk 14

对于像我一样来到这里的其他人来说,要真正找到range()与 Python 中的函数等效的 R 函数,我已经找到了答案。

这就是seq()功能。一些例子会比文字更好,但用法实际上与 Python 中相同:

> seq(from = 1, to = 5, by = 1)
[1] 1 2 3 4 5
> seq(from = 1, to = 6, by = 2)
[1] 1 3 5
> seq(5)
[1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)


Mau*_*ers 5

在 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"
Run Code Online (Sandbox Code Playgroud)

说明:该方法是一种从 中提取substrings 的基本滑动窗口方法ss。返回对象是一个list.


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

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

为了回应您的评论/编辑,这里有一个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
Run Code Online (Sandbox Code Playgroud)