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.
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.
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ść.
Czy istnieje sposób wklejenia więcej niż dwóch ciągów znaków? –
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"
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. :) –
@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
@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
Innym (zazwyczaj mniej przydatne) zaklęcie:
levels(interaction(x,y,sep=""))
# [1] "ac" "bc" "ad" "bd"
Jest to prawdopodobnie trywialna, ale nie mogę znaleźć funkcję 'paste0'. Zgaduję 'paste0 <- function (...) {paste (..., sep =" ")}', czy to prawda? – rbatt
'Wklej0' zostało dodane w wersji 2.15.0 i jest (nieco) szybszą wersją wklejania w/domyślnym separatorze jako pusty ciąg. –
@AdamHyland O wow, całkowicie to przegapiłem, dzięki! – rbatt