Подтвердить что ты не робот

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

У меня есть два вектора:

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"

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

4b9b3361

Ответ 1

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

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

expand.grid возвращает a 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"

Ответ 2

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

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

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"

Ответ 3

Другая опция, использующая 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 заменяется элементами векторов.

Ответ 4

Этот старый вопрос уже имеет принятый ответ. Но поскольку он используется как цель обмана, я считаю целесообразным добавить решение 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"