2016-08-13 1 views
4

У меня есть два вектора разной длины, и я хотел бы применить функцию к любой возможной комбинации двух векторов, в результате чего получается матрица.Примените функцию к двум векторам различной длины и верните матрицу в R

В моем конкретном примере, два вектора Charactor векторы, и я хотел бы применить функцию grepl, то есть:

names <- c('cats', 'dogs', 'frogs', 'bats') 
slices <- c('ca', 'at', 'ts', 'do', 'og', 'gs', 'fr', 'ro', 'ba') 

results <- someFunction(grepl, names, slices) 

results 
     ca at ts do og gs fr ro ba 
cats TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE 
dogs FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE 
frogs FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE 
bats FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE 

Прямо сейчас я использую for loops, но я уверен, что это лучший и более эффективным способом. Я провел много исследований по apply functions, а также aggregate, by, sweep и т. Д., Но не нашел то, что я ищу.

Спасибо за помощь.

+6

Проверьте 'outer' функцию. –

+4

'outer (names, slices, stringr :: str_detect)' – alistaire

+0

Вы также можете установить имена с '\' dimnames <- \ '(внешние (имена, срезы, stringr :: str_detect), список (имена, фрагменты)) ', подумал, что лучше всего сделать это в двух строках. – alistaire

ответ

3

Попробуйте

library(stringr) 
t(sapply(names,str_detect,pattern=slices)) 

Вы также можете сделать это в базе R, используя grepl

sapply(slices, grepl, names)