Staram się stworzyć unikalną kombinację wszystkich elementów z dwóch wektorów różnej wielkości w R.
Na przykład pierwszy wektor to
a <- c("ABC", "DEF", "GHI")
a druga to daty przechowywane obecnie jako ciągi znaków
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")
Muszę utworzyć ramkę danych z dwiema kolumnami, takimi jak ta
> 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
Zasadniczo szukam unikalnej kombinacji, biorąc pod uwagę wszystkie elementy jednego wektora (a) zestawione ze wszystkimi elementami drugiego wektora (b).
Idealne rozwiązanie uogólniłoby na więcej wektorów wejściowych.
Zobacz też:
Jak wygenerować macierz kombinacji
plyr
sortowania:result <- expand.grid(a=a,b=b); result <- result[order(result$a,result$b),];
expand.grid(b=b,a=a)[2:1]
tidyr
Pakiet zawiera alternatywę ładnecrossing
, który działa lepiej niż klasycznychexpand.grid
funkcji, ponieważ (1) struny nie są konwertowane na czynniki i (2) sortowanie jest bardziej intuicyjny: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ódło
Brakuje w tym r-faqprzegląd to
CJ
funkcja z plikuTabela danych-pakiet. Za pomocą:library(data.table) CJ(a, b, unique = TRUE)
daje:
UWAGA: od wersji 1.12.2 automatycznie
CJ
nadaje nazwy wynikowym kolumnom (zobacz także tutaj i tutaj ).źródło
Od wersji 1.0.0
tidyr
oferuje własną wersjęexpand.grid()
. To uzupełnia istniejącą rodzinęexpand()
,nesting()
orazcrossing()
z funkcji niskiego poziomu, który współpracuje z wektorami .W porównaniu z
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
źródło
możesz użyć funkcji kolejności do sortowania dowolnej liczby kolumn. na twój przykład
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`
źródło