计算r中单词向量中特定字母的出现次数

时间:2014-10-31 18:08:49

标签: r string count

我正在尝试计算长词向量中特定字母的数量。

例如:

我想在下面的矢量中计算字母“A”的数量。

myvec <- c("A", "KILLS", "PASS", "JUMP", "BANANA", "AALU", "KPAL")

所以预期的输出是:

c(1,0,1,0, 3,2,1)

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

library(stringr)
str_count(myvec, "A")
#[1] 1 0 1 0 3 2 1

 library(stringi)
 stri_count(myvec, fixed="A")
 #[1] 1 0 1 0 3 2 1

 vapply(strsplit(myvec,""), function(x) sum(x=='A'), integer(1))
 #[1] 1 0 1 0 3 2 1

答案 1 :(得分:8)

对于简洁的基础R解决方案,请尝试以下方法:

nchar(gsub("[^A]", "", myvec))
# [1] 1 0 1 0 3 2 1

答案 2 :(得分:7)

另一个可能性:

myvec <- c("A", "KILLS", "PASS", "JUMP", "BANANA", "AALU", "KPAL")

sapply(gregexpr("A", myvec, fixed = TRUE), function(x) sum(x > -1))

## [1] 1 0 1 0 3 2 1

编辑这是在乞求基准:

library(stringr); library(stringi); library(microbenchmark); library(qdapDictionaries)

myvec <- toupper(GradyAugmented)

GREGEXPR <- function() sapply(gregexpr("A", myvec, fixed = TRUE), function(x) sum(x > -1))
GSUB <- function() nchar(gsub("[^A]", "", myvec))
STRSPLIT <- function() sapply(strsplit(myvec,""), function(x) sum(x=='A'))
STRINGR <- function() str_count(myvec, "A")
STRINGI <- function()  stri_count(myvec, fixed="A")
VAPPLY_STRSPLIT <- function() vapply(strsplit(myvec,""), function(x) sum(x=='A'), integer(1))


(op <- microbenchmark( 
    GREGEXPR(),
    GSUB(),
    STRINGI(),
    STRINGR(),
    STRSPLIT(),
    VAPPLY_STRSPLIT(),    
times=50L))

## Unit: milliseconds
##               expr        min         lq       mean     median        uq        max neval
##         GREGEXPR() 477.278895 631.009023 688.845407 705.878827 745.73596  906.83006    50
##             GSUB() 197.127403 202.313022 209.485179 205.538073 208.90271  270.19368    50
##          STRINGI()   7.854174   8.354631   8.944488   8.663362   9.32927   11.19397    50
##          STRINGR() 618.161777 679.103777 797.905086 787.554886 906.48192 1115.59032    50
##         STRSPLIT() 244.721701 273.979330 331.281478 294.944321 348.07895  516.47833    50
##  VAPPLY_STRSPLIT() 184.042451 206.049820 253.430502 219.107882 251.80117  595.02417    50

boxplot(op)

stringi 一些主要的尾巴。 vapply + strsplit是一种很好的方法,就像简单的gsub方法一样。有趣的结果肯定。

enter image description here

答案 3 :(得分:0)

也可以使用sapply:

> sapply(strsplit(myvec,""), function(x) sum(x=='A'))
[1] 1 0 1 0 3 2 1