EXCEL问题: 统计下面方框内所有每个数的数量,在另外一行显示出来。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EXCEL问题: 统计下面方框内所有每个数的数量,在另外一行显示出来。相关的知识,希望对你有一定的参考价值。
列如:1有4个,2有5个。。。。。。
参考技术A P1 输入=row()&"有"&countif($K$1:$O$10,row())&"个"
鼠标移到P1 右下角变实心十字下拉 参考技术B 统计1的公式如下,其他的你自己改后面的数字
=countif($K$1:$O$10,1)追问
不好意思,不懂编程,能否说的详细点?
追答这个是公式,不是编程,
你在P1单元格输入这个公式,就能统计了.
如果你不想改制后面的数字,下拉就能统计1到N的数量, P1输入下面的公式,再下拉
=countif($K$1:$O$10,row(A1))
计算字符串中所有单词的数量
【中文标题】计算字符串中所有单词的数量【英文标题】:Count the number of all words in a string 【发布时间】:2012-02-13 18:19:07 【问题描述】:有计算字符串中单词数的函数吗? 例如:
str1 <- "How many words are in this sentence"
返回 7 的结果。
【问题讨论】:
基于下面@Martin 的回答,我创建了一个函数countwordpersentence.R,它计算给定文本字符串中每个句子的单词数。对于包含多个句子的长文本,它将计算所有句子中的单词并输出每个句子的平均单词数和总单词数。 str_count(temp$question1," ")+1 如果您知道每个单词都用空格分隔,那将很容易。它在库 stringr 下。 【参考方案1】:我使用 stringr
库中的 str_count
函数和转义序列 \w
表示:
任何“单词”字符(当前字符中的字母、数字或下划线) 语言环境:在 UTF-8 模式下,仅考虑 ASCII 字母和数字)
例子:
> str_count("How many words are in this sentence", '\\w+')
[1] 7
在我能够测试的所有其他 9 个答案中,到目前为止,只有两个(Vincent Zoonekynd 和 petermeissner)适用于此处提供的所有输入,但它们也需要 stringr
。
但只有此解决方案适用于目前提供的所有输入,以及 "foo+bar+baz~spam+eggs"
或 "Combien de mots sont dans cette phrase ?"
等输入。
基准测试:
library(stringr)
questions <-
c(
"", "x", "x y", "x y!", "x y! 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))
输出(11 是可能的最高分):
6 10 10 8 9 9 7 6 6 11
【讨论】:
这种方法非常好,但我仍然遇到的一个问题是它会重复计算包含撇号的单词(例如“I'm”或“John's”)。有没有办法解决这个问题? @Thredolsen 如果您确定不会将撇号视为单词分隔符,您可以使用字符类'[\\w\']+'
(无法测试,所以xkcd.com/1638 可能适用),否则我不确定正则表达式是否足够强大以在一般情况下处理它:)
不确定这是否是一个好的假设,但如果撇号后面总是只有一两个字母,那么'\\w+(\'\\w1,2)?'
可能是一个很好的解决方案。
谢谢。这两种方法在大多数情况下都有效,但 '[\\w\']+' 在我的情况下似乎更好,因为有些单词在撇号后包含超过 2 个字符(例如:o'clock)。相关的后续问题:有什么方法可以排除冒号后面直接跟一个数字字符的情况(例如,将 '10:15' 视为一个单词,而不是两个单词)?
在此评论中,我将使用普通的正则表达式语法,因此示例将需要一些额外的反斜杠。要覆盖o'clock
和friggin'
之类的词,您可以使用\w+('\w*)?
(我不知道是否有以撇号开头的词?)。要额外处理时间,您可以尝试像\d?\d:\d\d|\w+('\w*)?
一样匹配它们,或者根据您的需要做一些更复杂的事情。但这与 R 的关系越来越少,更多的是关于您如何定义一个词,所以也许您可以发布一个单独的问题来满足您的特定需求?【参考方案2】:
您可以使用字符串函数 str_split() 和 boundary(),它们将识别单词的边界,同时忽略标点符号和任何额外的空格
sapply(str_split("It's 12 o'clock already", boundary("word")), length)
#[1] 4
sapply(str_split(" It's >12 o'clock already ?! ", boundary("word")), length)
#[1] 4
【讨论】:
【参考方案3】:我发现以下函数和正则表达式对字数统计很有用,尤其是在处理单连字符和双连字符时,前者通常不应该算作分词,例如,知名、高保真;而双连字符是一个标点分隔符,不受空格的限制——例如括号内的注释。
txt <- "Don't you think e-mail is one word--and not two!" #10 words
words <- function(txt)
length(attributes(gregexpr("(\\w|\\w\\-\\w|\\w\\'\\w)+",txt)[[1]])$match.length)
words(txt) #10 words
Stringi 是一个有用的包。但是由于连字符,它在这个例子中多算了单词。
stringi::stri_count_words(txt) #11 words
【讨论】:
【参考方案4】:使用 stringr 包,还可以编写一个简单的脚本,例如通过 for 循环遍历字符串向量。
我们说
df$文本
包含我们有兴趣分析的字符串向量。首先,我们向现有数据框 df 添加额外的列,如下所示:
df$strings = as.integer(NA)
df$characters = as.integer(NA)
然后我们在字符串向量上运行一个for循环,如下所示:
for (i in 1:nrow(df))
df$strings[i] = str_count(df$text[i], '\\S+') # counts the strings
df$characters[i] = str_count(df$text[i]) # counts the characters & spaces
生成的列:strings 和 character 将包含单词和字符的计数,这将通过字符串向量一次性实现。
【讨论】:
【参考方案5】:使用正则表达式符号\\W
匹配非单词字符,使用+
表示一行中的一个或多个,以及gregexpr
查找字符串中的所有匹配项。单词是单词分隔符的个数加1。
lengths(gregexpr("\\W+", str1)) + 1
当“单词”不满足\\W
的非单词概念时(可以使用其他正则表达式\\S+
, [[:alpha:]]
等,但总是存在使用正则表达式方法的边缘情况)等。它可能比 strsplit
解决方案更有效,后者将为每个单词分配内存。正则表达式在?regex
中描述。
更新正如 cmets 和@Andri 在另一个答案中所指出的,该方法因(零)和一个单词字符串以及尾随标点符号而失败
str1 = c("", "x", "x y", "x y!" , "x y! z")
lengths(gregexpr("[A-z]\\W+", str1)) + 1L
# [1] 2 2 2 3 3
在这些或类似(例如,多个空格)情况下,许多其他答案也失败了。我认为我的回答对原始答案中“一个单词的概念”的警告涵盖了标点符号问题(解决方案:选择不同的正则表达式,例如[[:space:]]+
),但是零和一个单词的情况是一个问题; @Andri 的解决方案无法区分零词和一个词。所以采取“积极”的方法来寻找单词可能
sapply(gregexpr("[[:alpha:]]+", str1), function(x) sum(x > 0))
导致
sapply(gregexpr("[[:alpha:]]+", str1), function(x) sum(x > 0))
# [1] 0 1 2 2 3
同样,正则表达式可能会针对“单词”的不同概念进行细化。
我喜欢使用gregexpr()
,因为它可以节省内存。使用strsplit()
(如@user813966,但使用正则表达式来分隔单词)并利用分隔单词的原始概念的替代方法是
lengths(strsplit(str1, "\\W+"))
# [1] 0 1 2 2 3
这需要为每个创建的单词和中间的单词列表分配新的内存。当数据“大”时,这可能会相对昂贵,但对于大多数目的来说,它可能是有效且易于理解的。
【讨论】:
str1 <- c('s ss sss ss', "asdf asd hello this is your life!"); sapply(gregexpr("\\W+", str1), length) + 1
返回4
和8
。第一个正确,第二个太多。我认为这是计算标点符号。
我认为是在计算句尾的标点符号。很确定你会想告诉正则表达式忽略开始和结束匹配(对不起,它不好,否则我会自己修复它)。
sapply(gregexpr("\\W+", "word"), length) + 1
返回 2
谢谢@fsmart——我认为原始答案中关于“非单词概念”的免责声明涵盖了对标点符号的关注。我已经更新了回复。
感谢@jaycode,无法计算 1(或零)字输入是个问题。我已经更新了原来的答案。【参考方案6】:
需要(字符串)
定义一个非常简单的函数
str_words <- function(sentence)
str_count(sentence, " ") + 1
检查
str_words(This is a sentence with six words)
【讨论】:
【参考方案7】:require(stringr)
str_count(x,"\\w+")
单词之间有两个/三个空格会很好
所有其他答案的单词之间有多个空格。
【讨论】:
【参考方案8】:同样来自stringi
包,直接函数stri_count_words
stringi::stri_count_words(str1)
#[1] 7
【讨论】:
【参考方案9】:您可以删除双空格并计算字符串中" "
的数量以获取字数。 使用 stringr 和 rm_white
qdapRegex
str_count(rm_white(s), " ") +1
【讨论】:
【参考方案10】:您可以在库 qdap 中使用 wc 函数:
> str1 <- "How many words are in this sentence"
> wc(str1)
[1] 7
【讨论】:
【参考方案11】:使用nchar
如果字符串向量被称为x
(nchar(x) - nchar(gsub(' ','',x))) + 1
找出空格数然后加一个
【讨论】:
【参考方案12】:最简单的方法是:
require(stringr)
str_count("one, two three 4,,,, 5 6", "\\S+")
...计算非空格字符上的所有序列 (\\S+
)。
但是如果有一个小函数可以让我们也决定我们想计算哪种单词以及适用于整个向量也一样?
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
【讨论】:
【参考方案13】:试试这个
length(unlist(strsplit(str1," ")))
【讨论】:
【参考方案14】:从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
【讨论】:
@bartektartanus 这是一些不错的功能! 谢谢 :) 检查这个包的其余功能!我相信你会发现一些有趣的东西 :) 欢迎任何 cmets!【参考方案15】:解决方案 7 在只有一个单词的情况下不会给出正确的结果。 您不应该只计算 gregexpr 结果中的元素(如果不匹配,则为 -1),而是计算元素 > 0。
尔格:
sapply(gregexpr("\\W+", str1), function(x) sum(x>0) ) + 1
【讨论】:
如果str1
以非单词字符开头或结尾,这仍然会出现问题。如果这是一个问题,这个版本将只寻找单词之间的空格:sapply(gregexpr("\\b\\W+\\b", str, perl=TRUE), function(x) sum(x>0) ) + 1
【参考方案16】:
您可以使用strsplit
和sapply
函数
sapply(strsplit(str1, " "), length)
【讨论】:
只是一个更新,您现在可以在基础 R 中使用有点新的lengths
函数,它可以找到每个元素的长度:lengths(strsplot(str, " "))
这很好问题是当你有类似“word,word,word”的东西时它会返回 1【参考方案17】:
您可以将str_match_all
与可以识别您的话的正则表达式一起使用。
以下适用于初始、最终和重复的空格。
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]])
【讨论】:
【参考方案18】:str2 <- gsub(' 2,',' ',str1)
length(strsplit(str2,' ')[[1]])
gsub(' 2,',' ',str1)
确保所有单词仅由一个空格分隔,方法是将所有出现的两个或多个空格替换为一个空格。
strsplit(str,' ')
在每个空格处拆分句子并在列表中返回结果。 [[1]]
从该列表中抓取单词向量。 length
计算字数。
> 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
【讨论】:
制表符、换行符或不可破坏的空格呢? 复活 5 年旧答案的方法!使用 '\s'(在 R 中,'\\s')包含任何类型的空白而不是 ''。 我收到了关于我的答案的通知,并查看了其他人以稍微改进它们:D 不要生气! :) PS。我也喜欢数学和咖啡!以上是关于EXCEL问题: 统计下面方框内所有每个数的数量,在另外一行显示出来。的主要内容,如果未能解决你的问题,请参考以下文章