计算R中string的字数?

有没有函数来计算string中的字数? 例如

str1 <- "How many words are in this sentence" 

返回7的结果

谢谢。

使用正则expression式符号\\W匹配非单词字符,使用+表示一行中的一个或多个字符,以及gregexpr以查找string中的所有匹配项。 单词是单词分隔符的数量加1。

 sapply(gregexpr("\\W+", str1), length) + 1 

当一个“单词”不满足\\W的非单词概念时(这个单词可以和其他正则expression式\\S+[[:alpha:]]等等,但总会有一些正则expression式的边缘情况)等等。它可能比strsplit解决scheme更有效率,它将为每个单词分配内存。 正则expression式在?regex中描述。

更新正如在评论和@Andri的一个不同的答案中指出的那样,这个方法失败的时候是(零)和一个单词的string,以及尾随的标点符号

 > str1 = c("", "x", "xy", "xy!" , "xy! z") > sapply(gregexpr("[Az]\\W+", str1), length) + 1L [1] 2 2 2 3 3 

许多其他答案在这些或类似的(例如多个空间)情况下也失败。 我认为我的回答是在原始答案中关于“一个词的概念”的解释包含了标点符号的问题(解决scheme:select一个不同的正则expression式,例如[[:space:]]+ ),但是零和一个词的情况是问题; @安德里的解决scheme无法区分零和一个单词。 所以采取“积极”的方式来find话可能

 sapply(gregexpr("[[:alpha:]]+", str1), function(x) sum(x > 0)) 

导致

 > sapply(gregexpr("[[:alpha:]]+", str1), function(x) sum(x > 0)) [1] 0 1 2 2 3 

正则expression式也可以针对“单词”的不同概念进行细化。

我喜欢使用gregexpr()因为它的内存效率。 另一种使用strsplit() (像@ user813966,但用正则expression式来分隔单词)和利用原始的分隔单词的概念是

 > vapply(strsplit(str1, "\\W+"), length, integer(1)) [1] 0 1 2 2 3 

这需要为每个创build的单词和中间词表分配新的内存。 当数据“大”时,这可能相对昂贵,但对于大多数目的而言,这可能是有效的和可理解的。

最简单的方法是:

 require(stringr) str_count("one, two three 4,,,, 5 6", "\\S+") 

…计算非空格字符( \\S+ )上的所有序列。

但是一个小函数又可以让我们决定我们想要统计哪一种单词 ,哪一个单独运行在整个vector上呢?

 require(stringr) nwords <- function(string, pseudo=F){ ifelse( pseudo, pattern <- "\\S+", pattern <- "[[:alpha:]]+" ) str_count(string, pattern) } nwords("one, two three 4,,,, 5 6") # 3 nwords("one, two three 4,,,, 5 6", pseudo=T) # 6 
 str2 <- gsub(' {2,}',' ',str1) length(strsplit(str2,' ')[[1]]) 

gsub(' {2,}',' ',str1)确保所有的单词都被一个空格分开,用一个空格replace两个或多个空格的所有出现。

strsplit(str,' ')在每个空格处分割句子并将结果返回到列表中。 [[1]]从列表中抽取单词的向量。 length统计了多less个单词。

 > str1 <- "How many words are in this sentence" > str2 <- gsub(' {2,}',' ',str1) > str2 [1] "How many words are in this sentence" > strsplit(str2,' ') [[1]] [1] "How" "many" "words" "are" "in" "this" "sentence" > strsplit(str2,' ')[[1]] [1] "How" "many" "words" "are" "in" "this" "sentence" > length(strsplit(str2,' ')[[1]]) [1] 7 

你可以使用str_match_all和正则expression式来识别你的单词。 以下内容适用于初始,最终和重复的空格。

 library(stringr) s <- " Day after day, day after day, We stuck, nor breath nor motion; " m <- str_match_all( s, "\\S+" ) # Sequences of non-spaces length(m[[1]]) 

stringi包中试试这个函数

  require(stringi) > s <- c("Lorem ipsum dolor sit amet, consectetur adipisicing elit.", + "nibh augue, suscipit a, scelerisque sed, lacinia in, mi.", + "Cras vel lorem. Etiam pellentesque aliquet tellus.", + "") > stri_stats_latex(s) CharsWord CharsCmdEnvir CharsWhite Words Cmds Envirs 133 0 30 24 0 0 

你可以在库qdap中使用wc函数:

 > str1 <- "How many words are in this sentence" > wc(str1) [1] 7 

您可以删除双空格,并计算string中" "的数量以获得单词的数量。 使用stringrrm_white { qdapRegex }

 str_count(rm_white(s), " ") +1 

我使用stringr库中的stringr函数和转义序列\w表示:

任何“单词”字符(当前语言环境中的字母,数字或下划线:在UTF-8模式下,只考虑ASCII字母和数字)

例:

 > str_count("How many words are in this sentence", '\\w+') [1] 7 

在我能够testing的所有其他9个答案中,只有两个(由Vincent Zoonekynd和petermeissner)为这里提出的所有input工作,但他们也需要stringr

但是,只有这个解决scheme适用于迄今为止提出的所有input,加上诸如"foo+bar+baz~spam+eggs" "Combien de mots sont dans cette phrase ?" "foo+bar+baz~spam+eggs""Combien de mots sont dans cette phrase ?"

基准testing:

 library(stringr) questions <- c( "", "x", "xy", "xy!", "xy! z", "foo+bar+baz~spam+eggs", "one, two three 4,,,, 5 6", "How many words are in this sentence", "How many words are in this sentence", "Combien de mots sont dans cette phrase ?", " Day after day, day after day, We stuck, nor breath nor motion; " ) answers <- c(0, 1, 2, 2, 3, 5, 6, 7, 7, 7, 12) score <- function(f) sum(unlist(lapply(questions, f)) == answers) funs <- c( function(s) sapply(gregexpr("\\W+", s), length) + 1, function(s) sapply(gregexpr("[[:alpha:]]+", s), function(x) sum(x > 0)), function(s) vapply(strsplit(s, "\\W+"), length, integer(1)), function(s) length(strsplit(gsub(' {2,}', ' ', s), ' ')[[1]]), function(s) length(str_match_all(s, "\\S+")[[1]]), function(s) str_count(s, "\\S+"), function(s) sapply(gregexpr("\\W+", s), function(x) sum(x > 0)) + 1, function(s) length(unlist(strsplit(s," "))), function(s) sapply(strsplit(s, " "), length), function(s) str_count(s, '\\w+') ) unlist(lapply(funs, score)) 

输出:

 6 10 10 8 9 9 7 6 6 11 

尝试这个

 length(unlist(strsplit(str1," "))) 

在只有一个词的情况下,解决scheme7不能给出正确的结果。 您不应该只计算gregexpr结果中的元素(如果不匹配,则为-1),而是计算元素> 0。

人机工程学:

 sapply(gregexpr("\\W+", str1), function(x) sum(x>0) ) + 1 

您可以使用strsplitsapply函数

 sapply(strsplit(str1, " "), length) 

使用nchar

如果string的向量被称为x

 (nchar(x) - nchar(gsub(' ','',x))) + 1 

找出空格的数量,然后添加一个

require(stringr)str_count(x,“\ w +”)#会很好,单词之间有双/三倍空格

所有其他的答案有两个以上的空间单词之间的问题。