我正在将字符串拆分为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)。然后可以将其拆分为新列。
答案 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::rollapply
和strsplit
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