2014-10-31 11 views

Odpowiedz

7

Innym 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 

EDIT ten prosząc o wartość odniesienia:

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) 

I stringi koklusz kilka głównych ogon. The vapply + strsplit było miłym podejściem, podobnie jak proste podejście gsub. Interesujące wyniki na pewno.

enter image description here

+1

+1 za miłą benchmarku. – akrun

+1

@SHRram proszę nie przyznawać mi czeku. Dostarczyłem benchmarki głównie dlatego, że już je uruchomiłem dla własnej rozrywki. Jak widać moja odpowiedź jest blisko dna. Naprawdę chciałbym zasugerować przyznanie czeku na odpowiedź, której użyłeś. –

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

lub

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

lub

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

W 2 najszybsze i najwolniejsze podejścia są tutaj :-) +1 –

8

Na zwięzłego roztworu zasady R, spróbuj:

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

sapply może także być wykorzystana:

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