2015-12-11 2 views
4

Я два вектора:Векторизация для цикла в R

  • Вектор текстов c('abc', 'asdf', 'werd', 'ffssd')
  • Вектор моделей c('ab', 'd', 'w')

Я хотел бы векторизации следующее для- loop:

for(p in 1 : length(patterns)){ 
    count <- count + str_count(texts, p); 
} 

Я использовал следующие команды, но оба они не будут работать.

> str_count(texts, patterns) 
[1] 1 1 1 0 
Warning message: 
In stri_count_regex(string, pattern, opts_regex = attr(pattern, : 
    longer object length is not a multiple of shorter object length 

> str_count(texts, t(patterns)) 
[1] 1 1 1 0 
Warning message: 
In stri_count_regex(string, pattern, opts_regex = attr(pattern, : 
    longer object length is not a multiple of shorter object length 

Я хочу 2d матрица, как это:

 | patterns 
------+-------- 
     | 1 0 0 
texts | 0 1 0 
     | 0 1 1 
     | 0 1 0 
+0

'матрица (stringr :: str_count (Rep (тексты, длина (лекала)), rep (рисунки, каждая = длина (тексты))), длина (тексты), dimnames = список (тексты, узоры)) ' – rawr

ответ

8

Вы можете использовать outer. Я предполагаю, что вы используете str_count из пакета stringr.

library(stringr) 

texts <- c('abc', 'asdf', 'werd', 'ffssd') 
patterns <- c('ab', 'd', 'w') 

matches <- outer(texts, patterns, str_count) 

# set dim names 
colnames(matches) <- patterns 
rownames(matches) <- texts 
matches 
     ab d w 
abc 1 0 0 
asdf 0 1 0 
werd 0 1 1 
ffssd 0 1 0 

EDIT

# or set names directly within 'outer' as noted by @RichardScriven 
outer(setNames(nm = texts), setNames(nm = patterns), str_count) 
+1

Nice. Вы можете также установить имена в вызове 'external()'. 'external (setNames (nm = тексты), setNames (nm = patterns), str_count)' –

+0

@RichardScriven, ах да, спасибо – cdeterman

3

Использование dplyr и tidyrstringr):

library(dplyr) 
library(tidyr) 
library(stringr) 
expand.grid(texts, patterns) %>% 
    mutate_each(funs(as.character(.))) %>% 
    mutate(matches = stringr::str_count(Var1, Var2)) %>% 
    spread(Var2, matches) 
    Var1 ab d w 
1 abc 1 0 0 
2 asdf 0 1 0 
3 ffssd 0 1 0 
4 werd 0 1 1 
Смежные вопросы