【问题标题】:Count characters in a string (excluding spaces) in R?在R中计算字符串中的字符(不包括空格)?
【发布时间】:2015-02-06 22:07:56
【问题描述】:

我想计算字符串中的字符数(不包括空格),我想知道我的方法是否可以改进。

假设我有:

x <- "hello to you"

我知道nchar() 会给我一个字符串中的字符数(包括空格):

> nchar(x)
[1] 12

但我想返回以下内容(不包括空格):

[1] 10

为此,我做了以下工作:

> nchar(gsub(" ", "",x))
[1] 10

我担心gsub() 会花很长时间处理许多字符串。这是解决这个问题的正确方法,还是有一种 nchar'esque 函数可以返回字符数而不计算空格?

提前致谢。

【问题讨论】:

  • 你要转换多少个字符串? 1亿在我的机器上花了大约30秒。我认为你的技术很合理。
  • 你可以使用stringi::stri_count,它可能会更快
  • @nograpes,我一直在学习这门语言,并正在考虑将一本书的章节写成一个字符串。很高兴知道我的方法并不太老套。谢谢你给我一个基线。
  • @RichardScriven:谢谢,我以前没见过,所以我很乐意去看看。

标签: r string character gsub


【解决方案1】:

根据 Richard 的评论,“stringi”将是一个很好的考虑因素:

方法可以是计算整个字符串长度并减去空格数。

比较以下。

library(stringi)
library(microbenchmark)

x <- "hello to you"
x
# [1] "hello to you"
fun1 <- function(x) stri_length(x) - stri_count_fixed(x, " ")
fun2 <- function(x) nchar(gsub(" ", "",x))
y <- paste(as.vector(replicate(1000000, x, TRUE)), collapse = "     ")

microbenchmark(fun1(x), fun2(x))
# Unit: microseconds
#     expr   min    lq     mean median      uq    max neval
#  fun1(x) 5.560 5.988  8.65163  7.270  8.1255 44.047   100
#  fun2(x) 9.408 9.837 12.84670 10.691 12.4020 57.732   100
microbenchmark(fun1(y), fun2(y), times = 10)
# Unit: milliseconds
#     expr        min         lq      mean     median         uq        max neval
#  fun1(y)   68.22904   68.50273   69.6419   68.63914   70.47284   75.17682    10
#  fun2(y) 2009.14710 2011.05178 2042.8123 2030.10502 2079.87224 2090.09142    10

【讨论】:

  • 非常感谢您的解释。我不仅要检查 stringi,而且我很想研究 microbenchmark 包,这样我就可以自己回答这些类型的问题。感谢您“教我如何钓鱼”,而不仅仅是“给我鱼”。
  • @ChuckD.,没问题。当您自己探索这些类型的问题时,需要考虑的一件事是,通常情况下,添加 fixed 参数(如果可用)通常会提高速度。
  • @ChuckD.,既然您了解了 microbenchmark,您应该可以自己测试我之前的评论了 :-)
  • 我要深入研究它并试一试! :-)
【解决方案2】:

确实,stringi 似乎在这里最合适。试试这个:

library(stringi)
x <- "hello to you"
stri_stats_latex(x)

结果:

CharsWord CharsCmdEnvir    CharsWhite         Words          Cmds        Envirs 
       10             0             2             3             0             0

如果您需要在变量中使用它,您可以通过常规 [i] 访问参数,例如: stri_stats_latex(x)[1]

【讨论】:

    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 2012-07-12
    • 2019-06-03
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2012-09-09
    • 2021-09-18
    相关资源
    最近更新 更多