Jawaban:
Karena (masih) tidak ada yang mendapat tanda centang, saya berasumsi bahwa Anda memiliki beberapa masalah praktis dalam pikiran, terutama karena Anda belum menentukan jenis vektor apa yang ingin Anda konversi numeric
. Saya sarankan Anda harus menerapkan transform
fungsi untuk menyelesaikan tugas Anda.
Sekarang saya akan menunjukkan "anomali konversi" tertentu:
# create dummy data.frame
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
Mari kita melirik data.frame
> d
char fake_char fac char_fac num
1 a 1 1 a 1
2 b 2 2 b 2
3 c 3 3 c 3
4 d 4 4 d 4
5 e 5 5 e 5
dan mari kita jalankan:
> sapply(d, mode)
char fake_char fac char_fac num
"character" "character" "numeric" "numeric" "numeric"
> sapply(d, class)
char fake_char fac char_fac num
"character" "character" "factor" "factor" "integer"
Sekarang Anda mungkin bertanya pada diri sendiri, "Di mana anomali itu?" Yah, saya telah bertemu dengan hal-hal yang sangat aneh di R, dan ini bukan hal yang paling membingungkan, tetapi itu dapat membingungkan Anda, terutama jika Anda membaca ini sebelum berguling ke tempat tidur.
Ini dia: dua kolom pertama adalah character
. Saya sengaja menelepon nomor dua fake_char
. Temukan kesamaan character
variabel ini dengan variabel yang dibuat Dirk dalam jawabannya. Ini sebenarnya sebuah numerical
vektor yang dikonversi menjadi character
. 3 rd dan 4 th kolom yang factor
, dan yang terakhir adalah "murni" numeric
.
Jika Anda menggunakan transform
fungsi, Anda bisa mengubahnya fake_char
menjadi numeric
, tetapi bukan char
variabel itu sendiri.
> transform(d, char = as.numeric(char))
char fake_char fac char_fac num
1 NA 1 1 a 1
2 NA 2 2 b 2
3 NA 3 3 c 3
4 NA 4 4 d 4
5 NA 5 5 e 5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
tetapi jika Anda melakukan hal yang sama fake_char
dan char_fac
, Anda akan beruntung, dan lolos tanpa NA:
> transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
char fake_char fac char_fac num
1 a 1 1 1 1
2 b 2 2 2 2
3 c 3 3 3 3
4 d 4 4 4 4
5 e 5 5 5 5
Jika Anda menyimpan transformasi data.frame
dan memeriksa mode
dan class
, Anda akan mendapatkan:
> D <- transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
> sapply(D, mode)
char fake_char fac char_fac num
"character" "numeric" "numeric" "numeric" "numeric"
> sapply(D, class)
char fake_char fac char_fac num
"character" "numeric" "factor" "numeric" "integer"
Jadi, kesimpulannya adalah: Ya, Anda dapat mengubah character
vektor menjadi numeric
satu, tetapi hanya jika elemen-elemennya "dapat dikonversi" numeric
. Jika hanya ada satu character
elemen dalam vektor, Anda akan mendapatkan kesalahan ketika mencoba mengubah vektor itu menjadi numerical
satu.
Dan hanya untuk membuktikan maksud saya:
> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion
> char
[1] 1 NA 3 4 NA
Dan sekarang, hanya untuk bersenang-senang (atau berlatih), coba tebak output dari perintah ini:
> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
Salam untuk Patrick Burns! =)
Sesuatu yang telah membantu saya: jika Anda memiliki rentang variabel untuk dikonversi (atau lebih dari satu), Anda dapat menggunakannya sapply
.
Agak tidak masuk akal tetapi hanya sebagai contoh:
data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)
Katakanlah kolom 3, 6-15 dan 37 dari Anda dataframe perlu dikonversi menjadi numerik yang bisa:
dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)
sapply
panggilan di as.data.frame()
sisi kanan, seperti yang disarankan @Mehrad Mahmoudian di bawah ini, itu akan berfungsi.
jika x
adalah nama kolom dari dataframe dat
, dan x
merupakan tipe faktor, gunakan:
as.numeric(as.character(dat$x))
as.character
memang apa yang saya cari. Kalau tidak, konversi terkadang salah. Setidaknya dalam kasus saya.
Error: (list) object cannot be coerced to type 'double'
meskipun saya cukup yakin bahwa vektor saya tidak memiliki karakter / tanda baca. Kemudian saya mencoba as.numeric(as.character(dat$x))
dan berhasil. Sekarang saya tidak yakin apakah kolom saya sebenarnya hanya bilangan bulat atau tidak!
Meskipun pertanyaan Anda benar-benar numerik, ada banyak konversi yang sulit dipahami ketika memulai R. Saya akan berupaya membahas metode untuk membantu. Pertanyaan ini mirip dengan Pertanyaan Ini .
Konversi jenis dapat menjadi masalah di R karena (1) faktor tidak dapat dikonversi langsung ke numerik, mereka perlu dikonversi ke kelas karakter terlebih dahulu, (2) tanggal adalah kasus khusus yang biasanya perlu Anda tangani secara terpisah, dan (3) perulangan di kolom bingkai data bisa rumit. Untungnya, "tidyverse" telah menyelesaikan sebagian besar masalah.
Solusi ini digunakan mutate_each()
untuk menerapkan fungsi ke semua kolom dalam bingkai data. Dalam hal ini, kami ingin menerapkan type.convert()
fungsi, yang mengubah string menjadi numerik di mana ia bisa. Karena R menyukai faktor (tidak yakin mengapa) kolom karakter yang harus tetap karakter diubah menjadi faktor. Untuk memperbaikinya, mutate_if()
fungsi ini digunakan untuk mendeteksi kolom yang merupakan faktor dan berubah menjadi karakter. Terakhir, saya ingin menunjukkan bagaimana lubridate dapat digunakan untuk mengubah stempel waktu di kelas karakter ke waktu-tanggal karena ini juga sering merupakan blok yang sulit bagi pemula.
library(tidyverse)
library(lubridate)
# Recreate data that needs converted to numeric, date-time, etc
data_df
#> # A tibble: 5 × 9
#> TIMESTAMP SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 2012-05-04 09:30:00 BAC T 7.8900 38538 F 7.89 523 7.90
#> 2 2012-05-04 09:30:01 BAC Z 7.8850 288 @ 7.88 61033 7.90
#> 3 2012-05-04 09:30:03 BAC X 7.8900 1000 @ 7.88 1974 7.89
#> 4 2012-05-04 09:30:07 BAC T 7.8900 19052 F 7.88 1058 7.89
#> 5 2012-05-04 09:30:08 BAC Y 7.8900 85053 F 7.88 108101 7.90
# Converting columns to numeric using "tidyverse"
data_df %>%
mutate_all(type.convert) %>%
mutate_if(is.factor, as.character) %>%
mutate(TIMESTAMP = as_datetime(TIMESTAMP, tz = Sys.timezone()))
#> # A tibble: 5 × 9
#> TIMESTAMP SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR
#> <dttm> <chr> <chr> <dbl> <int> <chr> <dbl> <int> <dbl>
#> 1 2012-05-04 09:30:00 BAC T 7.890 38538 F 7.89 523 7.90
#> 2 2012-05-04 09:30:01 BAC Z 7.885 288 @ 7.88 61033 7.90
#> 3 2012-05-04 09:30:03 BAC X 7.890 1000 @ 7.88 1974 7.89
#> 4 2012-05-04 09:30:07 BAC T 7.890 19052 F 7.88 1058 7.89
#> 5 2012-05-04 09:30:08 BAC Y 7.890 85053 F 7.88 108101 7.90
mutate_all(type.convert, as.is=TRUE)
alih-alih mutate_all(type.convert)
, Anda dapat menghapus / menghindari mutate_if(is.factor, as.character)
untuk mempersingkat perintah. as.is
adalah argumen type.convert()
yang menunjukkan apakah string harus dikonversi sebagai karakter atau sebagai faktor. Secara default, as.is=FALSE
di type.convert()
(mis., Mengonversi string ke kelas faktor alih-alih kelas karakter).
Tim sudah benar, dan Shane memiliki kekurangan. Berikut adalah contoh tambahan:
R> df <- data.frame(a = as.character(10:15))
R> df <- data.frame(df, num = as.numeric(df$a),
numchr = as.numeric(as.character(df$a)))
R> df
a num numchr
1 10 1 10
2 11 2 11
3 12 3 12
4 13 4 13
5 14 5 14
6 15 6 15
R> summary(df)
a num numchr
10:1 Min. :1.00 Min. :10.0
11:1 1st Qu.:2.25 1st Qu.:11.2
12:1 Median :3.50 Median :12.5
13:1 Mean :3.50 Mean :12.5
14:1 3rd Qu.:4.75 3rd Qu.:13.8
15:1 Max. :6.00 Max. :15.0
R>
data.frame
Sekarang kami memiliki ringkasan kolom faktor (jumlah) dan ringkasan numerik dari as.numeric()
--- yang salah karena mendapat tingkat faktor numerik --- dan ringkasan (yang benar) dari as.numeric(as.character())
.
Dengan kode berikut Anda dapat mengonversi semua kolom bingkai data menjadi numerik (X adalah bingkai data yang ingin Anda konversi kolomnya):
as.data.frame(lapply(X, as.numeric))
dan untuk mengubah seluruh matriks menjadi numerik Anda memiliki dua cara: Baik:
mode(X) <- "numeric"
atau:
X <- apply(X, 2, as.numeric)
Sebagai alternatif, Anda dapat menggunakan data.matrix
fungsi untuk mengubah segalanya menjadi numerik, meskipun perlu diingat bahwa faktor-faktor tersebut mungkin tidak dapat dikonversi dengan benar, jadi lebih aman untuk mengonversi semuanya menjadi yang character
pertama:
X <- sapply(X, as.character)
X <- data.matrix(X)
Saya biasanya menggunakan yang terakhir ini jika saya ingin mengkonversi ke matriks dan angka secara bersamaan
Jika Anda mengalami masalah dengan:
as.numeric(as.character(dat$x))
Lihatlah tanda desimal Anda. Jika mereka "," bukannya "." (mis. "5,3") di atas tidak akan berfungsi.
Solusi potensial adalah:
as.numeric(gsub(",", ".", dat$x))
Saya percaya ini sangat umum di beberapa negara yang tidak berbahasa Inggris.
Cara universal menggunakan type.convert()
dan rapply()
:
convert_types <- function(x) {
stopifnot(is.list(x))
x[] <- rapply(x, utils::type.convert, classes = "character",
how = "replace", as.is = TRUE)
return(x)
}
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
sapply(d, class)
#> char fake_char fac char_fac num
#> "character" "character" "factor" "factor" "integer"
sapply(convert_types(d), class)
#> char fake_char fac char_fac num
#> "character" "integer" "factor" "factor" "integer"
as.is = TRUE
jika Anda ingin mengonversi karakter Anda menjadi angka atau faktor
matrix
ke perubahan numerik yang salah classes=matrix
argumen pertama harus dari karakter mode
Untuk mengonversi kolom bingkai data menjadi numerik, Anda cukup melakukan: -
faktor numerik: -
data_frame$column <- as.numeric(as.character(data_frame$column))
sapply(data_frame,function(x) as.numeric(as.character(x)))
Meskipun orang lain telah membahas topik dengan cukup baik, saya ingin menambahkan pemikiran / petunjuk cepat tambahan ini. Anda dapat menggunakan regexp untuk memeriksa terlebih dahulu apakah karakter yang berpotensi hanya terdiri dari angka.
for(i in seq_along(names(df)){
potential_numcol[i] <- all(!grepl("[a-zA-Z]",d[,i]))
}
# and now just convert only the numeric ones
d <- sapply(d[,potential_numcol],as.numeric)
Untuk ekspresi reguler yang lebih canggih dan alasan yang bagus untuk mempelajari / merasakan kekuatan mereka, lihat situs web yang sangat bagus ini: http://regexr.com/
Mengingat mungkin ada kolom char, ini didasarkan pada @Abdou di Dapatkan jenis lembar excel secara otomatis menjawab:
makenumcols<-function(df){
df<-as.data.frame(df)
df[] <- lapply(df, as.character)
cond <- apply(df, 2, function(x) {
x <- x[!is.na(x)]
all(suppressWarnings(!is.na(as.numeric(x))))
})
numeric_cols <- names(df)[cond]
df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
return(df)
}
df<-makenumcols(df)
Jika kerangka data memiliki beberapa jenis kolom, beberapa karakter, beberapa numerik coba yang berikut ini untuk mengonversi hanya kolom yang berisi nilai numerik ke angka:
for (i in 1:length(data[1,])){
if(length(as.numeric(data[,i][!is.na(data[,i])])[!is.na(as.numeric(data[,i][!is.na(data[,i])]))])==0){}
else {
data[,i]<-as.numeric(data[,i])
}
}
dengan hablar :: convert
Untuk dengan mudah mengonversi banyak kolom ke berbagai tipe data yang dapat Anda gunakan hablar::convert
. Sintaks sederhana: df %>% convert(num(a))
mengonversi kolom a dari df ke numerik.
Contoh terperinci
Mari kita konversi semua kolom mtcars
menjadi karakter.
df <- mtcars %>% mutate_all(as.character) %>% as_tibble()
> df
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
2 21 6 160 110 3.9 2.875 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
Dengan hablar::convert
:
library(hablar)
# Convert columns to integer, numeric and factor
df %>%
convert(int(cyl, vs),
num(disp:wt),
fct(gear))
menghasilkan:
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <int> <dbl> <dbl> <dbl> <dbl> <chr> <int> <chr> <fct> <chr>
1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
2 21 6 160 110 3.9 2.88 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
4 21.4 6 258 110 3.08 3.22 19.44 1 0 3 1
Untuk mengkonversi karakter ke numerik Anda harus mengubahnya menjadi faktor dengan menerapkan
BankFinal1 <- transform(BankLoan, LoanApproval=as.factor(LoanApproval))
BankFinal1 <- transform(BankFinal1, LoanApp=as.factor(LoanApproval))
Anda harus membuat dua kolom dengan data yang sama, karena satu kolom tidak dapat dikonversi menjadi angka. Jika Anda melakukan satu konversi itu memberikan kesalahan di bawah ini
transform(BankData, LoanApp=as.numeric(LoanApproval))
Warning message: In eval(substitute(list(...)), `_data`, parent.frame()) : NAs introduced by coercion
jadi, setelah melakukan dua kolom data yang sama berlaku
BankFinal1 <- transform(BankFinal1, LoanApp = as.numeric(LoanApp),
LoanApproval = as.numeric(LoanApproval))
itu akan berhasil mengubah karakter menjadi numerik
df
ist dataframe Anda. x
adalah kolom df
yang ingin Anda konversi
as.numeric(factor(df$x))
Jika Anda tidak peduli tentang menjaga faktor-faktor, dan ingin menerapkannya ke kolom apa pun yang dapat dikonversi menjadi numerik, saya menggunakan skrip di bawah ini. jika df adalah kerangka data asli Anda, Anda dapat menggunakan skrip di bawah ini.
df[] <- lapply(df, as.character)
df <- data.frame(lapply(df, function(x) ifelse(!is.na(as.numeric(x)), as.numeric(x), x)))