2013-06-17 9 views
5

muszę wkleić ciągi "każdy", aby "każdy": zamiastJak wkleić łańcuchy znaków (każdy z każdym)?

> paste0(c("a", "b"), c("c", "d")) 
[1] "ac" "bd" 

Chcę dostać

[1] "ac" "ad" "bc" "bd" 

Jak mam to zrobić?

Dzięki.

+0

Jest to prawdopodobnie trywialna, ale nie mogę znaleźć funkcję 'paste0'. Zgaduję 'paste0 <- function (...) {paste (..., sep =" ")}', czy to prawda? – rbatt

+2

'Wklej0' zostało dodane w wersji 2.15.0 i jest (nieco) szybszą wersją wklejania w/domyślnym separatorze jako pusty ciąg. –

+0

@AdamHyland O wow, całkowicie to przegapiłem, dzięki! – rbatt

Odpowiedz

8

można również do:

outer(c("a", "b"), c("c", "d"), FUN = "paste0")[1:4] 
[1] "ac" "bc" "ad" "bd" 

Zarówno do.call i outer to wartościowe funkcje do zabawy. :)

Alternatywnie, możemy przypisać

x <- outer(c("a", "b"), c("c", "d"), FUN = "paste0") 
dim(x) <- NULL 
x 
[1] "ac" "bc" "ad" "bd" 

Nie znając długość.

Więcej zmian!

x <- outer(c("a", "b"), c("c", "d"), FUN = "paste0") 
y <- t(x) 
dim(y) <- NULL 
y 
[1] "ac" "ad" "bc" "bd" 

Pobiera również żądaną kolejność.

+0

Czy istnieje sposób wklejenia więcej niż dwóch ciągów znaków? –

9

Spróbuj tego:

x <- c("a", "b") 
y <- c("c", "d") 

do.call(paste0, expand.grid(x, y)) 
# [1] "ac" "bc" "ad" "bd" 

Jest prawdopodobne, aby być wolniejsze niż outer gdy x i y są długie, ale z drugiej strony pozwala to następujące uogólnienie:

z <- c("e", "f") 

do.call(paste0, expand.grid(x, y, z)) 
# [1] "ace" "bce" "ade" "bde" "acf" "bcf" "adf" "bdf" 
+1

Możesz napisać wrapper do 'zewnętrznego', który zrobi to dla dowolnego liczba wejść. To WAAAY brzydszy niż 'expand.grid' (patrz [tutaj] (https://gist.github.com/Protonk/5799974) dla pierwszego cięcia), ale jest szybszy. Jak jednak zauważam, możesz uruchomić swój fragment 200 000 razy w ciągu 1/20 sekundy, więc prawdopodobnie jest w porządku. :) –

+0

@Julius, twoja odpowiedź była bardzo przydatna (+1). Czy istnieje jednak sposób na zachowanie porządku - na przykład podczas nazywania kolumn itp.? Dla np. powyżej, jeśli wymagane zamówienie to '" ac "" ad "" "bc" "bd" '? W moim przypadku mam słowa, które należy wkleić w określonej kolejności (aby zachować znaczenie). Dzięki! – harkmug

+2

@rmk, optymalnym sposobem na to byłoby zauważenie, że 'expand.grid' używa odwrotnego porządkowania w pewnym sensie w porównaniu do tego, czego potrzebujesz, czyli' do.call (paste0, expand.grid (y, x) [ 2: 1]) 'powinno działać. Podobnie np. 'expand.grid (z, y, x) [3: 1]'. – Julius

7

Innym (zazwyczaj mniej przydatne) zaklęcie:

levels(interaction(x,y,sep="")) 
# [1] "ac" "bc" "ad" "bd" 
Powiązane problemy