Я пытаюсь создать уникальную комбинацию всех элементов из двух векторов разного размера в R.
Например, первый вектор
a <- c("ABC", "DEF", "GHI")
а второй - даты, хранящиеся в настоящее время в виде строк
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")
Мне нужно создать фрейм данных с двумя столбцами, подобными этому
> data
a b
1 ABC 2012-05-01
2 ABC 2012-05-02
3 ABC 2012-05-03
4 ABC 2012-05-04
5 ABC 2012-05-05
6 DEF 2012-05-01
7 DEF 2012-05-02
8 DEF 2012-05-03
9 DEF 2012-05-04
10 DEF 2012-05-05
11 GHI 2012-05-01
12 GHI 2012-05-02
13 GHI 2012-05-03
14 GHI 2012-05-04
15 GHI 2012-05-05
По сути, я ищу уникальную комбинацию, рассматривая все элементы одного вектора (a), сопоставленные со всеми элементами второго вектора (b).
Идеальным решением было бы обобщение на большее количество входных векторов.
См. Также:
Как создать матрицу комбинаций
plyr
просто делать сортировку:result <- expand.grid(a=a,b=b); result <- result[order(result$a,result$b),];
expand.grid(b=b,a=a)[2:1]
tidyr
Пакет обеспечивает хорошую альтернативуcrossing
, которая работает лучше , чем классическиеexpand.grid
функции , потому что (1) строки не превращаются в факторы , и (2) сортировка более интуитивная:library(tidyr) a <- c("ABC", "DEF", "GHI") b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05") crossing(a, b) # A tibble: 15 x 2 a b <chr> <chr> 1 ABC 2012-05-01 2 ABC 2012-05-02 3 ABC 2012-05-03 4 ABC 2012-05-04 5 ABC 2012-05-05 6 DEF 2012-05-01 7 DEF 2012-05-02 8 DEF 2012-05-03 9 DEF 2012-05-04 10 DEF 2012-05-05 11 GHI 2012-05-01 12 GHI 2012-05-02 13 GHI 2012-05-03 14 GHI 2012-05-04 15 GHI 2012-05-05
источник
Отсутствует в этом r-faqОбзор - это
CJ
функция изТаблица данных-пакет. С помощью:library(data.table) CJ(a, b, unique = TRUE)
дает:
ПРИМЕЧАНИЕ: начиная с версии 1.12.2 автоматически
CJ
называются результирующие столбцы (см. Также здесь и здесь ).источник
Начиная с версии 1.0.0,
tidyr
предлагает собственную версиюexpand.grid()
. Он завершает существующую семьюexpand()
,nesting()
иcrossing()
с функцией низкого уровня , который работает с векторами .По сравнению с
base::expand.grid()
:a <- c("ABC", "DEF", "GHI") b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05") tidyr::expand_grid(a, b) a b <chr> <chr> 1 ABC 2012-05-01 2 ABC 2012-05-02 3 ABC 2012-05-03 4 ABC 2012-05-04 5 ABC 2012-05-05 6 DEF 2012-05-01 7 DEF 2012-05-02 8 DEF 2012-05-03 9 DEF 2012-05-04 10 DEF 2012-05-05 11 GHI 2012-05-01 12 GHI 2012-05-02 13 GHI 2012-05-03 14 GHI 2012-05-04 15 GHI 2012-05-05
источник
вы можете использовать функцию заказа для сортировки любого количества столбцов. для вашего примера
df <- expand.grid(a,b) > df Var1 Var2 1 ABC 2012-05-01 2 DEF 2012-05-01 3 GHI 2012-05-01 4 ABC 2012-05-02 5 DEF 2012-05-02 6 GHI 2012-05-02 7 ABC 2012-05-03 8 DEF 2012-05-03 9 GHI 2012-05-03 10 ABC 2012-05-04 11 DEF 2012-05-04 12 GHI 2012-05-04 13 ABC 2012-05-05 14 DEF 2012-05-05 15 GHI 2012-05-05 > df[order( df[,1], df[,2] ),] Var1 Var2 1 ABC 2012-05-01 4 ABC 2012-05-02 7 ABC 2012-05-03 10 ABC 2012-05-04 13 ABC 2012-05-05 2 DEF 2012-05-01 5 DEF 2012-05-02 8 DEF 2012-05-03 11 DEF 2012-05-04 14 DEF 2012-05-05 3 GHI 2012-05-01 6 GHI 2012-05-02 9 GHI 2012-05-03 12 GHI 2012-05-04 15 GHI 2012-05-05`
источник