我正在尝试计算长词向量中特定字母的数量。
例如:
我想在下面的矢量中计算字母“A”的数量。
myvec <- c("A", "KILLS", "PASS", "JUMP", "BANANA", "AALU", "KPAL")
所以预期的输出是:
c(1,0,1,0, 3,2,1)
有什么想法吗?
答案 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
方法一样。有趣的结果肯定。
答案 3 :(得分:0)
> sapply(strsplit(myvec,""), function(x) sum(x=='A'))
[1] 1 0 1 0 3 2 1