【问题标题】:Is there an R function equivalent to range in Python?是否有与 Python 中的 range 等效的 R 函数?
【发布时间】:2019-08-27 02:19:42
【问题描述】:

我希望将字符串拆分为 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"

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

【问题讨论】:

  • 很少使用 substring 而不是 substr,它循环所有输入 - substring("HelloWorld",1:8,3:10) - 但这仅适用于长度为 1 的向量 - 因为 substring(c("HelloWorld","ABC"),1:8,3:10) 不没有按预期工作。这样就够了吗?
  • @thelatemail 对我来说看起来不错。

标签: r string stringr


【解决方案1】:

在基础 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"

说明:该方法是从ss 中提取substrings 的基本滑动窗口方法。返回对象是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

【讨论】:

  • 感谢 Maurits - 该方法适用于单个字符串。你知道我是否可以在数据框中应用它,以便它标记每个单元格中所需字符串的值并将结果存储为向量或将其拆分到数据框中的多个列?
  • @BrisbanePom 当然,这很容易做到。您能否编辑您的帖子以包含一个最小且具有代表性的示例data.frame,以便我们在同一页面上?
  • @BrisbanePom 我已经进行了编辑,请看一下。
  • 是的 - 做的工作:-)
【解决方案2】:

对于像我一样来到这里的其他人,要真正找到与 Python 中的 range() 函数等效的 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

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 2019-12-31
    • 2015-06-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2016-06-28
    相关资源
    最近更新 更多