2014-10-31 85 views
6

我正在計算長單詞向量中特定字母的數量。計算r中單詞向量中特定字母的出現

例如:

我想在下面的矢量來算字母「A」的數。

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

那麼預期輸出是:

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

任何想法?

回答

7

另一個posibility:

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哮一些重大的尾巴。與簡單的gsub方法一樣,vapply + strsplit是一個很好的方法。肯定有趣的結果。

enter image description here

+1

爲基準不錯。 – akrun 2014-11-01 03:56:25

+1

@SHRram請不要給我支票。我提供的基準主要是因爲我已經爲了自己的娛樂而運行它們。正如你可以看到我的答案接近底部。我真的會建議將支票授予您使用的答案。 – 2014-11-03 15:39:16

7
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 
+0

2.最快和最慢的方法在這裏:-) +1 +1 – 2014-11-01 03:22:22

8

對於簡潔基礎R溶液,嘗試:

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

sapply還可以用於:

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