2013-04-22 1 views
40

У меня есть два вектора:Вклеивание два вектора с комбинациями элементов всех векторов

vars <- c("SR", "PL") 
vis <- c(1,2,3) 

На основе этих векторов я хотел бы создать следующий вектор:

"SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

С paste У меня есть следующий результат:

paste(vars, vis, sep=".") 
[1] "SR.1" "PL.2" "SR.3" 

Как создать вектор, который мне нужен?

ответ

47

Вы можете использовать это, но может быть более простое решение:

R> apply(expand.grid(vars, vis), 1, paste, collapse=".") 
[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3" 

expand.grid дает обратно data.frame, которая при использовании apply, apply преобразует его в matrix. Это просто лишний (и неэффективен при больших данных). outer дает matrix, а также принимает аргумент функции. Это будет очень эффективно и для огромных данных.

Использование outer:

as.vector(outer(vars, vis, paste, sep=".")) 
# [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3" 
6

Для поддержания порядка запрашиваемых строк в вопросе, вы можете использовать эти две модификации обоих методов:

Изменить порядок векторов и объединить в обратном порядке

apply(expand.grid(vis, vars), 1, function(x) paste(x[2], x[1], sep=".")) 
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

или транспонирование матрицы перед преобразованием в векторе:

as.vector(t(outer(vars, vis, paste, sep="."))) 
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 
4

Другой вариант использования sprintf в сочетании с expand.grid:

eg <- expand.grid(vis, vars) 
sprintf('%s.%s', eg[,2], eg[,1]) 

, который дает:

[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

Объяснение:

  • С expand.grid вы создаете все комбинации двух векторов.
  • sprintf вставляет два вектора вместе в соответствии с указанным форматом ('%s.%s'). Каждая часть формата %s заменяется элементами векторов.
+1

I подумайте, что это самое элегантное решение из всех предложенных! –

5

Этот старый вопрос уже имеет принятый ответ.Но, как он используется в качестве мишени дубликатов, я считаю, что стоит добавить data.table решения, которое использует в перекрестном соединении функции CJ():

library(data.table) 
CJ(vars, vis)[, paste(V1, V2, sep =".")] 
#[1] "PL.1" "PL.2" "PL.3" "SR.1" "SR.2" "SR.3" 

В случае первоначальный заказ важен:

CJ(vars, vis, sorted = FALSE)[, paste(V1, V2, sep =".")] 
#[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

 Смежные вопросы

  • Нет связанных вопросов^_^