Saya memiliki file csv di mana beberapa nilai numerik diekspresikan sebagai string dengan koma sebagai pemisah seribu, misalnya, "1,513"
bukan 1513
. Apa cara termudah untuk membaca data menjadi R?
Saya dapat menggunakan read.csv(..., colClasses="character")
, tetapi kemudian saya harus menghapus koma dari elemen yang relevan sebelum mengubah kolom tersebut menjadi numerik, dan saya tidak dapat menemukan cara yang rapi untuk melakukannya.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
).setClass("num.with.commas")
atausuppresMessage(setAs(.....))
untuk menghindari pesan tentang kelas yang hilang.Saya ingin menggunakan R daripada melakukan pra-pemrosesan data karena akan lebih mudah ketika data direvisi. Mengikuti saran Shane untuk menggunakan
gsub
, saya pikir ini serapi yang bisa saya lakukan:sumber
Pertanyaan ini sudah berumur beberapa tahun, tetapi saya menemukannya, yang berarti mungkin orang lain akan melakukannya.
The
readr
library / paket memiliki beberapa fitur yang bagus untuk itu. Salah satunya adalah cara yang bagus untuk menafsirkan kolom "berantakan", seperti ini.Ini hasil
Sumber: bingkai data lokal [4 x 1]
Poin penting saat membaca dalam file: Anda harus melakukan pra-proses, seperti komentar di atas
sed
, atau Anda harus memproses saat membaca . Seringkali, jika Anda mencoba memperbaiki sesuatu setelah kejadian, ada beberapa asumsi berbahaya yang dibuat dan sulit ditemukan. (Itulah sebabnya file datar pada awalnya sangat jahat.)Misalnya, jika saya tidak menandai
col_types
, saya akan mendapatkan ini:(Perhatikan bahwa sekarang a
chr
(character
) bukan anumeric
.)Atau, yang lebih berbahaya, jika cukup panjang dan sebagian besar elemen awal tidak mengandung koma:
(sedemikian rupa sehingga beberapa elemen terakhir terlihat :)
Maka Anda akan kesulitan membaca koma itu sama sekali!
sumber
sebuah
dplyr
solusi menggunakanmutate_all
dan pipakatakanlah Anda memiliki yang berikut:
dan ingin menghapus koma dari variabel tahun X2014-X2016, dan mengubahnya menjadi numerik. juga, katakanlah X2014-X2016 dibaca sebagai faktor (default)
mutate_all
menerapkan fungsi di dalamfuns
kolom yang ditentukanSaya melakukannya secara berurutan, satu fungsi pada satu waktu (jika Anda menggunakan beberapa fungsi di dalamnya
funs
maka Anda membuat kolom tambahan yang tidak perlu)sumber
mutate_each
sudah ditinggalkan. Apakah Anda ingin memperbarui jawaban Anda denganmutate_at
atau yang serupa?"Proses awal" di R:
Dapat digunakan
readLines
ditextConnection
. Kemudian hapus hanya koma yang ada di antara digit:Ini juga berguna untuk mengetahui tetapi tidak secara langsung relevan dengan pertanyaan ini bahwa koma sebagai pemisah desimal dapat ditangani oleh read.csv2 (secara otomatis) atau read.table (dengan pengaturan 'dec'-parameter).
Sunting: Kemudian saya menemukan bagaimana menggunakan colClasses dengan merancang kelas baru. Lihat:
Bagaimana cara memuat df dengan 1000 pemisah di R sebagai kelas numerik?
sumber
Jika angka dipisahkan oleh "." dan desimal dengan "," (1.200.000,00) saat menelepon
gsub
Anda harusset fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))
sumber
Cara yang paling nyaman adalah
readr::read_delim
-keluarga. Mengambil contoh dari sini: Mengimpor csv dengan beberapa pemisah ke R Anda dapat melakukannya sebagai berikut:Yang menghasilkan hasil yang diharapkan:
sumber
Dengan menggunakan fungsi read_delim, yang merupakan bagian dari library readr , Anda dapat menentukan parameter tambahan:
* Titik koma di baris kedua berarti read_delim akan membaca nilai yang dipisahkan titik koma csv.
Ini akan membantu membaca semua angka dengan koma sebagai angka yang benar.
Salam
Mateusz Kania
sumber
Kita juga bisa menggunakan
readr::parse_number
, kolom harus karakter. Jika kita ingin menerapkannya untuk beberapa kolom, kita dapat melakukan loop melalui kolom menggunakanlapply
Atau gunakan
mutate_at
daridplyr
untuk menerapkannya ke variabel tertentu.data
sumber
Saya pikir preprocessing adalah cara yang harus dilakukan. Anda dapat menggunakan Notepad ++ yang memiliki opsi ganti ekspresi reguler.
Misalnya, jika file Anda seperti ini:
Kemudian, Anda dapat menggunakan ekspresi reguler
"([0-9]+),([0-9]+)"
dan menggantinya dengan\1\2
Kemudian Anda bisa menggunakan
x <- read.csv(file="x.csv",header=FALSE)
untuk membaca file tersebut.sumber