Уникальная комбинация всех элементов из двух (или более) векторов
Я пытаюсь создать уникальную комбинацию всех элементов из двух векторов разного размера в 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).
Идеальное решение будет обобщать на большее количество входных векторов.
См. также:
Как создать матрицу комбинаций
Ответы
Ответ 1
это возможно, что вы после
> expand.grid(a,b)
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
Если полученный заказ не является тем, что вы хотите, вы можете сортировать его позже. Если вы укажете аргументы expand.grid
, они станут именами столбцов:
df = expand.grid(a = a, b = b)
df[order(df$a), ]
И expand.grid
обобщает на любое количество входных столбцов.
Ответ 2
Пакет 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
Ответ 3
Вы можете использовать функцию заказа для сортировки любого количества столбцов. для вашего примера
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'
Ответ 4
В этом обзоре отсутствует CJ
-function из data.table -package. С помощью:
library(data.table)
CJ(a = a, b = b, unique = TRUE)
дает:
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
В последней версии data.table вы можете просто использовать: CJ(a, b, unique = TRUE)