Вставка двух векторов с комбинациями всех элементов векторов
У меня есть два вектора:
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"
Как создать вектор, который мне нужен?
Ответы
Ответ 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"