Soru Veri çerçeve sütunu sayısal tür nasıl dönüştürülür?


Veri çerçeve sütununu sayısal bir türe nasıl dönüştürebilirsiniz?


201
2018-02-18 12:17


Menşei




Cevaplar:


(Hala) hiç kimse onay işareti almadığından, aklınızda bazı pratik sorun olduğunu varsayalım, çünkü ne türden bir vektörü dönüştürmek istediğinizi belirlemediniz. numeric. Başvurman gerektiğini tavsiye ederim transform Görevinizi tamamlamak için işlev.

Şimdi belirli "dönüşüm anomalisi" ni göstermek üzereyim:

# 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)

Bir göz atalım 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

ve koşalım:

> 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" 

Şimdi muhtemelen kendinize sorun "Bir anomali nerede?" Şey, R'de çok tuhaf şeylere çarptım.  En şaşırtıcı şey, ama kafanızı karıştırabilir, özellikle de bunu yatağa girmeden önce okursanız.

İşte gider: ilk iki sütun character. Ben kasten 2 aradımnd bir fake_char. Bunun benzerliğini belirle character Dirk, yanıtında oluşturduğu bir değişkenle. Aslında bir numerical vektör dönüştürülür character. 3rd ve 4inci sütun factorve sonuncusu "tamamen" numeric.

Kullanırsanız transform işlevini dönüştürebilirsiniz fake_char içine numericama değil char değişkenin kendisi.

> 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

ama aynı şeyi yaparsan fake_char ve char_facşanslı olursunuz ve NA'lar olmadan kaçarsınız:

> 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

Eğer dönüştürülmüş kaydederseniz data.frame ve kontrol edin mode ve class, alacaksınız:

> 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"

Yani sonuç: Evet, dönüştürebilirsiniz character içine vektör numeric Bir, ama sadece elemanları "dönüştürülebilir" ise numeric.


223
2018-02-19 00:31



'stringsAsFactors = FALSE' veri dosyalarında okurken önemlidir. - Robert Brisita
Bunun eski olduğunu biliyorum ... ama ... neden df $ fake_char <- as.integer (df $ fake_char) üzerinden transform () öğesini seçtiniz? R'de aynı işlemi yapmanın birden çok yolu var ve bunu yapmanın “doğru” yolunu anlayamıyorum. Teşekkür ederim. - ripvlan
Yani err <- c (1, "b", 3, 4, "e") sayısal bir vektöre dönüştürmek kesinlikle imkansızdır? Excel'de, "sayıya dönüştür" sağlayan bir düğme var. sütunu nümerik olursa olsun sayısal yapmak. Bunu r'ye benzetmeye çalışıyorum. - flightless13wings
Uyarı! = Hata. Karışık sayısal / karakterleri sayısal olarak dönüştüren bir hata almazsınız, bir uyarı ve bazı NA değerleri alırsınız. - Gregor


Bana yardımcı olan bir şey: dönüştürmek için değişkenler aralığınız varsa (veya sadece bir tanesini), sapply.

Biraz saçma ama sadece örneğin:

data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)

Veritabanınızın 3, 6-15 ve 37 sütunlarını sayısal bir değere dönüştürmeniz gerektiğini söyleyin:

dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)

111
2018-02-18 16:15



Yukarıdaki koddaki as.factor sütun karakterini yapar - MySchizoBuddy
sapply, değişken isimler yerine indekslerin vektörlerini ele alırken dönüşümden daha iyidir - smci
@MySchizoBuddy, en azından verilerimle doğru. Orijinal df, "dönüştürülmüş" sütunları faktör olarak kabul etmez; karakter kalırlar. Eğer sapply aramak as.data.frame() Aşağıda, @Mehrad Mahmoudian'ın önerdiği gibi, işe yarayacaktır. - knowah


Eğer x veri çerçevesinin sütun adıdır dat, ve x tip faktördür, kullanın:

as.numeric(as.character(dat$x))

67
2018-02-18 12:22



ekleme as.character gerçekten aradığım şey buydu. Aksi halde dönüşüm bazen yanlış olur. En azından benim durumumda. - Thieme Hennis
As.character neden gereklidir? Bir hatayla karşılaşıyordum: Error: (list) object cannot be coerced to type 'double' Her ne kadar benim vektörümün hiçbir karakter / noktalama işareti içermediğinden eminim. Sonra denedim as.numeric(as.character(dat$x)) ve çalıştı. Şimdi sütunumun aslında tamsayı olup olmadığından emin değilim! - vagabond
Bir faktöre as.numerik yaparsanız, seviyeleri gerçek değerleri değil sayısal olarak dönüştürür. Bu nedenle, önce faktörü karaktere ve sonra as.numerik dönüştürmek için as.character gereklidir - MySchizoBuddy
Buradaki en iyi cevap budur - mitoRibo


Bir yorum ekleyecektim (düşük puan veremiyorum)

Sadece kullanıcı276042 ve pangratz eklemek

dat$x = as.numeric(as.character(dat$x))

Bu mevcut sütun x'in değerlerini geçersiz kılar


18
2017-12-06 05:58





Tim haklı ve Shane'in bir ihmali var. İşte ek örnekler:

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> 

bizim data.frame şimdi faktör sütununun (sayımlarının) bir özetini ve sayısal özetleri vardır. as.numeric() --- hangisi yanlış sayısal faktör düzeyleri --- ve (doğru) özetini aldıkça as.numeric(as.character()).


14
2018-02-18 14:41



+1 Bunu işaretlediğiniz için teşekkürler. Kaldırdım. - Shane
Zevkle. Bu, dilin daha aptalca köşelerinden biri ve bence daha eski 'R Gotchas' sorusuyla ilgili. - Dirk Eddelbuettel


Aşağıdaki kodla tüm veri çerçeve sütunlarını sayısal olarak dönüştürebilirsiniz (X, sütunlarını dönüştürmek istediğimiz veri çerçevesidir):

as.data.frame(lapply(X, as.numeric))

ve tüm matrisi sayısal olarak dönüştürmek için iki yolunuz vardır: Ya:

mode(X) <- "numeric"

veya:

X <- apply(X, 2, as.numeric)

Alternatif olarak kullanabilirsiniz data.matrix herşeyi nümerik olarak dönüştürmek için işlevler olsa da, faktörlerin doğru şekilde dönüştürülemeyebileceğinin farkında olun, bu yüzden her şeyi dönüştürmek daha güvenlidir character ilk:

X <- sapply(X, as.character)
X <- data.matrix(X)

Genellikle kullanırım bu sonuncusu Eğer istersem aynı anda matris ve sayısal dönüştürmek için


13
2018-03-18 23:27





Eğer sorunlarla karşılaşırsanız:

as.numeric(as.character(dat$x))

Ondalık işaretlerine bir göz atın. "." Yerine ",". (ör. "5,3") yukarıdakiler işe yaramaz.

Potansiyel bir çözüm:

as.numeric(gsub(",", ".", dat$x))

Bazı İngilizce konuşulan ülkelerde bu oldukça yaygın olduğuna inanıyorum.


8
2017-07-15 14:12





Kullanarak evrensel yol type.convert() ve 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"

6
2017-10-10 05:35



Bu en esnek çözüm - bazı upvotes hak ediyor! - Richard Border
En iyi cevap olmalı. Sadece kaldır as.is = TRUE karakterinizi nümerik veya faktörlere dönüştürmek istiyorsanız - qfazille
türü olan bir data.frame dosyasında sütun demetini değiştirmeye çalışmak matrix sayısal değişikliklere classes=matrix İlk argümanı çıkarılan mod karakteri olmalı - Null-Hypothesis
çekicilik gibi çalıştı - ski_squaw


Sorunuz kesinlikle sayısal olarak yapılsa da, R'yi başlatırken anlaşılması zor olan birçok dönüşüm vardır. Yardımcı olmaya yönelik yöntemleri ele almayı hedeflerim. Bu soru benzer Bu soru.

Tip dönüşümü R için bir acı olabilir çünkü (1) faktörler doğrudan sayıya dönüştürülemez, öncelikle karakter sınıfına dönüştürülmelidir, (2) tarihler genellikle ayrı ayrı ele almanız gereken özel bir durumdur ve (3) veri çerçeve sütunları arasında döngü yapmak zor olabilir. Neyse ki, "tidyverse" konuların çoğunu çözdü.

Bu çözüm kullanır mutate_each() Bir veri çerçevesindeki tüm sütunlara bir işlev uygulamak. Bu durumda, biz uygulamak istiyoruz type.convert() dizeleri, dizeleri mümkün olduğu yere çevirir. Çünkü R faktörleri seviyor (neden olmasın) karakter kalması gereken karakter sütunlarını değiştirir. Bunu düzeltmek için mutate_if() işlev, faktörler olan ve karaktere dönüşen sütunları tespit etmek için kullanılır. Son olarak, karakter sınıfındaki zaman damgasını tarih-zamana değiştirmek için yağışın nasıl kullanılabileceğini göstermek istedim çünkü bu aynı zamanda yeni başlayanlar için sık sık yapışan bir blok.


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_each(funs(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

6
2018-03-05 14:13





Veri çerçeve sütununu sayısal olarak dönüştürmek için yapmanız gereken sadece: -

sayısal faktör: -

data_frame$column <- as.numeric(as.character(data_frame$column))

3
2018-04-18 07:25



Yine, bu cevap mevcut cevap kümesine hiçbir şey eklemiyor. Ayrıca, bir faktörü sayısal olarak dönüştürmek için tercih edilen yol değildir. Görmek stackoverflow.com/q/3418128 tercih edilen yol için. - BenBarnes
Daha iyi bir cevap oldu: sapply(data_frame,function(x) as.numeric(as.character(x))) - data-frame-gg


Diğerleri konuyu oldukça iyi bir şekilde ele alsa da, bu ek hızlı düşünce / ipucu eklemek istiyorum. Karakterlerin potansiyel olarak yalnızca sayısallardan oluşup oluşmadığını önceden kontrol etmek için regexp'i kullanabilirsiniz.

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)

Daha sofistike düzenli ifadeler ve niçin güçlerini öğrenmek / deneyimlemek için bu gerçekten güzel bir web sitesine bakın: http://regexr.com/


2
2017-10-24 08:53