Data.frame sütun formatını karakterden faktöre dönüştür


159

Benim data.frame nesnesinin (bazı sütunların biçimi (sınıfı) değiştirmek isterdiniz mydfitibaren) charactor için faktör .

Metin dosyasını read.table()işleve göre okurken bunu yapmak istemiyorum .

Herhangi bir yardım memnuniyetle karşılanacaktır.


13
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
tim riffe

Teşekkürler! ama başka bir sorunum var. Col_names [] karakterlerinden oluşan bir dizide her sütunun adına sahibim. Yukarıdaki komutu nasıl kullanabilirim (mydf $ col_names [i]) çalışmıyor.
Rasoul

Data.frame'in stringsAsFactors ile yaptığı gibi, bunu tüm karakter değişkenleri için otomatik olarak yapmanın bir yolu var mı?
Etienne Low-Décarie

@ EtienneLow-Décarie: sadece unclassve data.framesonuçta kullanın .
IRTFM

Yanıtlar:


203

Merhaba R. dünyasına hoş geldiniz.

mtcars  #look at this built in data set
str(mtcars) #allows you to see the classes of the variables (all numeric)

#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)
#another approach
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl'])
str(mtcars)  # now look at the classes

Bu aynı zamanda karakter, tarihler, tam sayılar ve diğer sınıflar için de geçerlidir.

R'de yeni olduğunuz için şu iki web sitesine göz atmanızı öneririm:

R referans kılavuzları: http://cran.r-project.org/manuals.html

R Referans kartı: http://cran.r-project.org/doc/contrib/Short-refcard.pdf


Teşekkürler! ama başka bir sorunum var. Col_names [] karakterlerinden oluşan bir dizide her sütunun adına sahibim. Yukarıdaki komutu nasıl kullanabilirim (ne işe yaramaz ne mydf$col_names[i]de mydf[,col_names[i]]çalışmaz.)
Rasoul

1
@Rasoul, mydf[, col_names]bunu yapacak
DrDom

3
Referanslar için +1. Bu temel şeylerdir ve sorulabilir, ancak bu (ve benzer) çalışmalara yapılan kapsamlı çalışmaların farkında olmak da sorun değildir.
Roman Luštrik

85
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
 col_names <- names(df)
# to do it for some names in a vector named 'col_names'
df[col_names] <- lapply(df[col_names] , factor)

Açıklama. Tüm veri çerçeveleri listelerdir ve [birden çok değerli bağımsız değişkenle birlikte kullanılan sonuçlar da aynı şekilde listelerdir, bu nedenle listeler üzerinde döngü yapmak görevidir lapply. Yukarıdaki atama, işlevin veri çerçevesine data.frame.[<-başarıyla geri yapışması gereken bir dizi liste oluşturacaktır ,df

Başka bir strateji, yalnızca benzersiz öğe sayısının bazı kriterlerden daha az olduğu sütunları dönüştürmek olabilir, örnek olarak satır sayısı günlüğünden daha az diyelim:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)

Bu çok güzel bir çözüm! Ayrıca, çoğunu değil de çoğunu değiştirmek istiyorsanız özellikle yararlı olabilecek sütun numaralarıyla da çalışabilir. Örneğin, sütun_sayısı <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57) sonra df [, sütun_sayısı] <- lapply (df [, sütun_sayları] , faktör).
WGray

Uyarı: İlk çözüm eğer işe yaramaz length(col_names)==1. Bu durumda, df[,col_names]1 uzunluğundaki bir liste yerine otomatik olarak bir vektöre indirgenir ve daha sonra lapplybir bütün olarak sütun yerine her girdi üzerinde işlem yapmaya çalışır. Bu, kullanılarak önlenebilir df[,col_names,drop=FALSE].
P Schnell

Bu iyi bir nokta. Liste durumunu koruyacak diğer çağrı kullanmaktır df[col_names].
IRTFM

29

dplyr::mutate_if()Tüm karakter sütunlarını dönüştürmek dplyr::mutate_at()için veya adlandırılmış karakter sütunlarını faktörlere dönüştürmek için kullanabilirsiniz :

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)

18

Eğer değiştirmek isterseniz tüm zaten verilerinizi yüklü sonra faktörlere sizin data.frame karakter değişkenleri, adlı bir data.frame için böyle yapabilirsin dat:

character_vars <- lapply(dat, class) == "character"
dat[, character_vars] <- lapply(dat[, character_vars], as.factor)

Bu, hangi sütunların sınıfta olduğunu tanımlayan bir vektör oluşturur characterve ardından as.factorbu sütunlara uygulanır .

Örnek veri:

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )

İle, örneğin, veri okurken faktörüne her karakter değişkeninin tam dönüşüm genellikle öyle olur stringsAsFactors = TRUE, ama diyelim ki, sen ile veri okudum bu yararlıdır read_excel()gelen readxlpaket ve kabul etmediğini rastgele orman modeli yetiştirmek istiyoruz karakter değişkenleri.
Sam Firke

13

Kullanabileceğiniz başka bir kısa yol %<>%, magrittr paketinden bir boru ( ) ' dur . Mycolumn karakter sütununu bir faktöre dönüştürür .

library(magrittr)

mydf$mycolumn %<>% factor

Lütfen daha fazla bilgi ile düzenleyin. Yalnızca kod ve "bunu dene" yanıtları, aranabilir içerik içermediğinden ve birisinin neden "bunu denemesi" gerektiğini açıklamadığından önerilmez. Burada bilgi kaynağı olmak için çaba sarf ediyoruz.
Brian Tompsett - 汤 莱恩

df'imin tüm sütunları için kullanmak istemiyorsam lütfen?
Mostafa

5

Bunu bir işlevle yapıyorum. Bu durumda, sadece karakter değişkenlerini çarpanlara çevireceğim:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}

Sütunu gerçekten çıkarmak ve bir faktöre dönüştürmek için çift parantezlere ihtiyacınız olduğuna inanıyorum, örneğin[[i]]
RTrain3k
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.