Saya mengalami beberapa masalah dengan memimpin dan mengikuti spasi putih di data.frame. Misalnya saya ingin lihat tertentu row
dalam data.frame
berdasarkan kondisi tertentu:
> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)]
[1] codeHelper country dummyLI dummyLMI dummyUMI
[6] dummyHInonOECD dummyHIOECD dummyOECD
<0 rows> (or 0-length row.names)
Saya bertanya-tanya mengapa saya tidak mendapatkan hasil yang diharapkan karena negara Austria jelas ada di negara saya data.frame
. Setelah melihat sejarah kode saya dan mencoba mencari tahu apa yang salah, saya mencoba:
> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
codeHelper country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18 AUT Austria 0 0 0 0 1
dummyOECD
18 1
Semua yang saya ubah dalam perintah adalah spasi tambahan setelah Austria.
Masalah menjengkelkan lebih lanjut jelas muncul. Misal ketika saya ingin menggabungkan dua frame berdasarkan kolom negara. Satu data.frame
menggunakan "Austria "
sementara bingkai lainnya "Austria"
. Pencocokan tidak berfungsi.
- Apakah ada cara yang bagus untuk 'menunjukkan' spasi putih di layar saya sehingga saya mengetahui masalahnya?
- Dan bisakah saya menghapus spasi putih terkemuka dan tertinggal di R?
Sejauh ini saya biasa menulis Perl
skrip sederhana yang menghilangkan spasi, tetapi alangkah baiknya jika saya bisa melakukannya di dalam R.
sub()
menggunakanPerl
notasi juga. Maaf soal itu. Saya akan mencoba menggunakan fungsinya. Tetapi untuk pertanyaan pertama saya, saya belum punya solusi.Jawaban:
Mungkin cara terbaik adalah menangani spasi putih tambahan saat Anda membaca file data Anda. Jika Anda menggunakan
read.csv
atauread.table
Anda dapat mengatur parameterstrip.white=TRUE
.Jika Anda ingin membersihkan string setelahnya, Anda dapat menggunakan salah satu fungsi ini:
Untuk menggunakan salah satu fungsi ini di
myDummy$country
:Untuk 'menunjukkan' spasi putih yang dapat Anda gunakan:
yang akan menunjukkan string yang dikelilingi oleh tanda kutip (") membuat spasi putih lebih mudah dikenali.
sumber
str_trim
distringr
paket.Pada R 3.2.0, sebuah fungsi baru diperkenalkan untuk menghilangkan spasi putih depan / belakang:
Lihat: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
sumber
\n
berada di kelas karakter tertutup.trimws("SELECT\n blah\n FROM foo;")
masih berisi baris baru.trimws
regex cukup cepat.stringr::str_trim
(berdasarkanstringi
) juga menarik karena menggunakan pustaka string yang sepenuhnya diinternasionalkan yang sepenuhnya independen. Anda akan berpikir spasi putih akan kebal dari masalah dengan internasionalisasi, tapi saya ingin tahu. Saya belum pernah melihat perbandingan hasil asli vsstringr
/stringi
atau tolok ukur apa pun.trimws()
tidak menghapus spasi putih utama saya, sementara Bryan ditrim.strings()
bawah ini (hanya 1 suara, milik saya!) ...Untuk memanipulasi ruang putih, gunakan str_trim () dalam paket stringr. Paket ini memiliki manual bertanggal 15 Februari 2013 dan dalam CRAN. Fungsi ini juga dapat menangani vektor string.
(kredit jatuh ke komentator: R. Cotton)
sumber
trimws()
tidak dapat dihapus.Fungsi sederhana untuk menghapus spasi putih depan dan belakang:
Pemakaian:
sumber
ad1) Untuk melihat spasi putih Anda bisa langsung menelepon
print.data.frame
dengan argumen yang dimodifikasi:Lihat juga
?print.data.frame
untuk opsi lain.sumber
Gunakan grep atau grepl untuk menemukan pengamatan dengan spasi putih dan sub untuk menyingkirkannya.
sumber
"^\\s+|\\s+$"
gsub
alih-alihsub
dengan regexp hadley. Dengansub
itu akan menghapus trailing whitespace hanya jika tidak ada whitespace terkemuka ...Saya lebih suka menambahkan jawaban sebagai komentar untuk pengguna56 tetapi belum dapat menulis sebagai jawaban independen. Menghapus blanking leading dan trailing dapat dicapai melalui fungsi trim () dari paket gdata juga:
Contoh penggunaan:
sumber
Masalah terkait lainnya terjadi jika Anda memiliki beberapa spasi di antara input:
Anda kemudian dapat dengan mudah membagi string ini menjadi token "nyata" menggunakan ekspresi reguler ke
split
argumen:Perhatikan bahwa jika ada kecocokan di awal string (tidak kosong), elemen pertama dari output adalah '""', tetapi jika ada kecocokan di akhir string, outputnya sama dengan dengan pertandingan dihapus.
sumber
Opsi lain adalah menggunakan
stri_trim
fungsi daristringi
paket yang defaultnya untuk menghapus spasi putih depan dan akhir:Untuk hanya menghapus spasi putih terkemuka, gunakan
stri_trim_left
. Untuk hanya menghapus spasi spasi, gunakanstri_trim_right
. Saat Anda ingin menghapus karakter utama atau karakter lainnya, Anda harus menentukannya denganpattern =
.Lihat juga
?stri_trim
untuk info lebih lanjut.sumber
Saya membuat
trim.strings ()
fungsi untuk memangkas spasi memimpin dan / atau mengikuti spasi sebagai:Untuk ilustrasi,
sumber
Metode terbaik adalah trimws ()
Kode berikut akan menerapkan fungsi ini ke seluruh kerangka data
sumber
df[] <- lapply(df, trimws)
agar lebih kompak. Tetapi dalam kedua kasus akan memaksa kolom untuk karakter.df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)
Supaya aman.Saya mencoba trim (). Berfungsi dengan baik dengan spasi putih dan juga '\ n'. x = '\ n Harden, J. \ n'
trim (x)
sumber
Setelah ini, Anda harus memaksa R untuk tidak mengenali "Austria" sebagai level. Anggap Anda juga memiliki level "AS" dan "Spanyol":
Sedikit kurang mengintimidasi daripada respons suara tertinggi, tetapi tetap harus bekerja.
sumber