计算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中" "
的数量以获得单词的数量。 使用stringr和rm_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
您可以使用strsplit
和sapply
函数
sapply(strsplit(str1, " "), length)
使用nchar
如果string的向量被称为x
(nchar(x) - nchar(gsub(' ','',x))) + 1
找出空格的数量,然后添加一个
require(stringr)str_count(x,“\ w +”)#会很好,单词之间有双/三倍空格
所有其他的答案有两个以上的空间单词之间的问题。