Bagaimana saya bisa menggabungkan (menggabungkan, menggabungkan) dua nilai? Misalnya saya punya:
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
Tujuan saya adalah menggabungkan dua nilai dalam "tmp" ke satu string:
tmp_new = "GAD,AB"
Fungsi mana yang bisa melakukan ini untuk saya?
r
string-concatenation
r-faq
Hans
sumber
sumber
Jawaban:
adalah cara untuk pergi. Seperti yang ditunjukkan poster sebelumnya, tempel dapat melakukan dua hal:
menggabungkan nilai menjadi satu "string", mis
di mana argumen
sep
menentukan karakter yang akan digunakan antara argumen untuk menyatukan, atau menciutkan vektor karakterdi mana argumen
collapse
menentukan karakter yang akan digunakan di antara elemen-elemen vektor yang akan diciutkan.Anda bahkan dapat menggabungkan keduanya:
Semoga ini membantu.
sumber
paste()
untuk selera saya. Misalnya,paste(c('a','b'),'blah', c(1,2,3))
hasil dalam"a blah 1" "b blah 2" "a blah 3"
. Pada dasarnya, ia menciptakan vektor string dengan panjang yang sama dengan vektor terpanjang yang dilewati, dan loop vektor / string lainnya ke panjang yang sama. Banyak ruang untuk perilaku tidak disengaja di sana.paste0("blah", 1:3)
mendapatkan"blah1" "blah2" "blah3"
.data.frame()
tidak membiarkan Anda melakukannya jika vektor bukan kelipatan satu sama lain.matrix()
memuntahkan peringatan, tetapiarray()
tidak. Agak menyebalkan. Sungguh, mereka semua harus mengeluarkan peringatan kecuali beberapa opsi ditetapkan ...help.search()
adalah fungsi praktis, misakan membawa Anda ke
paste()
.sumber
Untuk
paste()
jawaban pertama , kita bisa melihatstringr::str_c()
(dan kemudiantoString()
bawah). Belum ada selama pertanyaan ini, jadi saya pikir itu berguna untuk menyebutkan bahwa itu juga ada.Sangat mudah digunakan, seperti yang Anda lihat.
Dari deskripsi file dokumentasinya, ini cocok dengan masalah ini.
Ditambahkan 4/13/2016 : Ini tidak persis sama dengan output yang Anda inginkan (ruang ekstra), tetapi tidak ada yang menyebutkannya juga.
toString()
pada dasarnya adalah versipaste()
dengancollapse = ", "
hard-coded, jadi Anda bisa melakukannyasumber
paste
tidak melakukan vektor. Pilihan lainnya adalahdo.call(paste, as.list(tmp))
.Seperti yang telah ditunjukkan orang lain,
paste()
adalah jalan yang harus ditempuh. Tapi itu bisa menjengkelkan harus mengetikpaste(str1, str2, str3, sep='')
setiap kali Anda ingin pemisah non-standar.Anda dapat dengan mudah membuat fungsi pembungkus yang membuat hidup lebih sederhana. Misalnya, jika Anda mendapati diri Anda merangkai senar tanpa pemisah, Anda dapat:
atau jika Anda sering ingin menggabungkan string dari vektor (seperti
implode()
dari PHP):Memungkinkan Anda melakukan ini:
Juga, ada built-in
paste0
, yang melakukan hal yang sama seperti sayaimplode
, tetapi tanpa mengizinkan pemisah kustom. Ini sedikit lebih efisien daripadapaste()
.sumber
Saya menemukan ini dari Google dengan mencari string gabungan R : http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html
sumber
Atau, jika tujuan Anda adalah untuk menampilkan langsung ke file atau stdout, Anda dapat menggunakan
cat
:sumber
paste
jawaban 4 tahun kemudian ketika sudah ada sekitar selusinpaste
jawaban?Cara lain:
Kadang-kadang berguna daripada
paste()
fungsi.%s
menunjukkan tempat di mana string subjektif akan dimasukkan.Perhatikan bahwa ini akan berguna saat Anda mencoba membangun jalur:
keluaran
sumber
paste
tidak cukup fleksibel jika Anda ingin menambahkan sesuatu ke string.Anda dapat membuat operator Anda sendiri:
Anda juga dapat mendefinisikan ulang
&
operator 'dan' ( ):mengacaukan sintaksis dasar jelek, tetapi begitu juga menggunakan
paste()/paste0()
jika Anda hanya bekerja dengan kode Anda sendiri, Anda dapat (hampir selalu) mengganti& and
operator logis dengan*
dan melakukan penggandaan nilai-nilai logis daripada menggunakan logis 'dan &'sumber
paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4]))
danas.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
Dengan matriks, tmp, yang Anda buat:
Saya berasumsi ada beberapa alasan mengapa Anda membuat matriks menggunakan cbind, bukan hanya:
sumber
Pertimbangkan kasus di mana string adalah kolom dan hasilnya harus berupa kolom baru:
Secara opsional, lewati
[c("a", "b")]
subset jika semua kolom perlu ditempel.sumber
stringi, stringr
perpustakaan lebih cepat.Jawaban tanpa tempel lainnya:
Dimana
sumber
glue
adalah fungsi baru, kelas data, dan paket yang telah dikembangkan sebagai bagian daritidyverse
, dengan banyak fungsi tambahan. Ini menggabungkan fitur dari tempel, sprintf, dan jawaban lain sebelumnya.Dibuat pada 2019-03-06 oleh paket reprex (v0.2.1)
Ya, itu berlebihan untuk contoh sederhana dalam pertanyaan ini, tetapi kuat untuk banyak situasi. (lihat https://glue.tidyverse.org/ )
Contoh cepat dibandingkan
paste
dengan diwith
bawah ini. Theglue
kode adalah sedikit lebih mudah untuk mengetik dan tampak agak lebih mudah dibaca.Dibuat pada 2019-03-06 oleh paket reprex (v0.2.1)
sumber