2013-04-22 18 views

Odpowiedz

47

Można to wykorzystać, ale nie może być prostsze rozwiązanie:

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

expand.grid daje powrotem data.frame który użyty z apply, apply będzie przekonwertować go do matrix. Jest to po prostu niepotrzebne (i nieskuteczne w przypadku dużych danych). outer podaje matrix, a także przyjmuje argument funkcji. Będzie to również bardzo skuteczne w przypadku ogromnych danych.

Korzystanie outer:

as.vector(outer(vars, vis, paste, sep=".")) 
# [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3" 
6

Aby zachować kolejność żądanych strun w pytaniu, można użyć tych dwóch modyfikacji obu metod:

Zmień kolejność wektorów i połączyć w odwrotnej kolejności

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" 

lub transpozycję macierzy przed konwersją do wektora:

as.vector(t(outer(vars, vis, paste, sep="."))) 
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 
4

Inną opcją korzystania sprintf w połączeniu z expand.grid:

eg <- expand.grid(vis, vars) 
sprintf('%s.%s', eg[,2], eg[,1]) 

co daje:

[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

Objaśnienie:

  • Z expand.grid utworzyć wszystkie kombinacje dwóch wektorów.
  • sprintf wkleja dwa wektory zgodnie z określonym formatem ('%s.%s'). Każda część formatu jest zamieniana na elementy wektorów.
+1

I uważam, że jest to najbardziej eleganckie rozwiązanie wszystkich sugerowanych! –

5

To stare pytanie ma już zaakceptowaną odpowiedź.Ale jak to jest używane jako cel dupe, uważam, że to warto dodać data.table rozwiązanie, które wykorzystuje krzyż dołączyć funkcję CJ():

library(data.table) 
CJ(vars, vis)[, paste(V1, V2, sep =".")] 
#[1] "PL.1" "PL.2" "PL.3" "SR.1" "SR.2" "SR.3" 

W przypadku, gdy oryginalna kolejność jest istotna:

CJ(vars, vis, sorted = FALSE)[, paste(V1, V2, sep =".")] 
#[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"