Jak mogę połączyć (połączyć, połączyć) dwie wartości? Na przykład mam:
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
Moim celem jest połączenie dwóch wartości w „tmp” w jeden ciąg:
tmp_new = "GAD,AB"
Która funkcja może to dla mnie zrobić?
r
string-concatenation
r-faq
Hans
źródło
źródło
Odpowiedzi:
jest droga. Jak zauważyli poprzedni plakaty, wklej może zrobić dwie rzeczy:
łączyć wartości w jeden „ciąg”, np
gdzie argument
sep
określa znak (znaki), które mają być użyte między argumentami w celu połączenia lub zwinięcia wektorów znakówgdzie argument
collapse
określa znak (znaki), które mają być użyte między elementami wektora, który ma zostać zwinięty.Możesz nawet połączyć oba:
Mam nadzieję że to pomoże.
źródło
paste()
. Na przykładpaste(c('a','b'),'blah', c(1,2,3))
wyniki w"a blah 1" "b blah 2" "a blah 3"
. Zasadniczo tworzy wektor łańcuchów o tej samej długości co najdłuższy wektor, który jest przekazywany i zapętla inne wektory / łańcuchy na tę samą długość. Dużo miejsca na przypadkowe zachowanie.paste0("blah", 1:3)
zdobycie"blah1" "blah2" "blah3"
.data.frame()
nie pozwala ci tego zrobić, jeśli wektory nie są wielokrotnością siebie.matrix()
wyrzuca ostrzeżenia, alearray()
nie robi tego. Trochę irytujące. Naprawdę, wszyscy powinni wypluć ostrzeżenia, chyba że ustawiono jakąś opcję ...help.search()
jest przydatną funkcją, npdoprowadzi cię do
paste()
.źródło
W przypadku pierwszego braku
paste()
odpowiedzi możemy spojrzeć nastringr::str_c()
(a następnietoString()
poniżej). To pytanie nie istniało tak długo, więc myślę, że warto wspomnieć, że istnieje.Bardzo prosty w użyciu, jak widać.
Z opisu pliku dokumentacji ładnie pasuje do tego problemu.
Dodano 13.04.2016 : To nie jest dokładnie to samo, co pożądane wyjście (dodatkowe miejsce), ale nikt też o tym nie wspomniał.
toString()
jest w zasadzie wersjąpaste()
zcollapse = ", "
zakodowanym na stałe, więc możesz to zrobićźródło
paste
nie robi wektorów. Inną opcją jestdo.call(paste, as.list(tmp))
.Jak zauważyli inni,
paste()
jest to najlepsza droga. Ale denerwujące może byćpaste(str1, str2, str3, sep='')
pisanie za każdym razem, gdy chcesz użyć domyślnego separatora.Możesz bardzo łatwo tworzyć funkcje opakowania, które znacznie upraszczają życie. Na przykład, jeśli często łączysz łańcuchy bez separatora, możesz:
lub jeśli często chcesz łączyć ciągi z wektora (np.
implode()
z PHP):Pozwala to zrobić:
Jest też wbudowana funkcja
paste0
, która robi to samo co mojaimplode
, ale nie zezwala na niestandardowe separatory. Jest nieco bardziej wydajny niżpaste()
.źródło
Znalazłem to od Google, szukając R konkatenujących ciągów : http://stat.ethz.ch/R-manual/R-pched/library/base/html/paste.html
źródło
Alternatywnie, jeśli Twoim celem jest wyjście bezpośrednio do pliku lub standardowego wyjścia, możesz użyć
cat
:źródło
paste
odpowiedź 4 lata później, kiedy już jest kilkanaściepaste
odpowiedzi?Inny sposób:
Czasami jest przydatny niż
paste()
funkcja.%s
oznacza miejsce, w którym zostaną uwzględnione ciągi subiektywne.Pamiętaj, że przyda się to podczas próby zbudowania ścieżki:
wynik
źródło
paste
nie jest wystarczająco elastyczny, jeśli chcesz dołączyć coś do łańcucha.Możesz stworzyć własnego operatora:
Możesz także ponownie zdefiniować
&
operator „i” ( ):mieszanie się ze składnią podstawową jest brzydkie, ale tak samo jest przy użyciu,
paste()/paste0()
jeśli pracujesz tylko z własnym kodem, możesz (prawie zawsze) zastąpić& and
operator logiczny*
i powielać wartości logiczne zamiast używać logicznych „i”źródło
paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4]))
ias.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
Biorąc pod uwagę macierz, tmp, którą utworzyłeś:
Zakładam, że istnieje jakiś powód, dla którego tworzysz macierz za pomocą cbind, a nie po prostu:
źródło
Rozważ przypadek, w którym ciągi są kolumnami, a wynikiem powinna być nowa kolumna:
Opcjonalnie
[c("a", "b")]
możesz pominąć podzbiór, jeśli wszystkie kolumny wymagają wklejenia.źródło
stringi, stringr
biblioteki są szybsze.Inna odpowiedź niepasująca:
Gdzie
źródło
glue
to nowa funkcja, klasa danych i pakiet, który został opracowany w ramachtidyverse
, z dużą ilością rozszerzonych funkcji. Łączy funkcje z wklejania, sprintf i poprzednich innych odpowiedzi.Utworzono 2019-03-06 przez pakiet reprezentx (v0.2.1)
Tak, jest to przesada w przypadku prostego przykładu w tym pytaniu, ale potężny w wielu sytuacjach. (patrz https://glue.tidyverse.org/ )
Szybki przykład w porównaniu
paste
zwith
poniższym. Theglue
Kod był nieco łatwiejszy do pisania i wygląda nieco łatwiejsze do odczytania.Utworzono 2019-03-06 przez pakiet reprezentx (v0.2.1)
źródło