चरित्र से कारक के लिए data.frame स्तंभ प्रारूप परिवर्तित करें


153

मैं अपने data.frame वस्तु (के कुछ स्तंभों की प्रारूप (वर्ग) को बदलना चाहते हैं mydfसे) charactor के कारक

जब मैं read.table()फ़ंक्शन द्वारा पाठ फ़ाइल पढ़ रहा होता हूं, तो मैं ऐसा नहीं करना चाहता ।

किसी भी सहायता की सराहना की जाएगी।


12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
टिम रीफ

धन्यवाद! लेकिन मुझे एक और समस्या है। मेरे पास प्रत्येक कॉलम का नाम वर्णों के एक समूह col_names [] में है। मैं उपरोक्त कमांड (mydf $ col_names [i]) का उपयोग कैसे कर सकता हूं।
रसूल

सभी वर्ण चर के लिए स्वचालित रूप से ऐसा करने का कोई भी तरीका, जैसा कि data.frame तार के साथ करता है।
इटियेन लो-डेकेरी

@ EtienneLow-Décarie: बस unclassऔर data.frameपरिणाम पर उपयोग करें ,।
आईआरटीएफएम

जवाबों:


197

हाय, आर की दुनिया में आपका स्वागत है।

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

यह चरित्र, दिनांक, पूर्णांक और अन्य वर्गों के लिए भी काम करता है

जब से आप R के लिए नए हैं, मैं आपको इन दो वेबसाइटों पर एक नज़र डालने का सुझाव दूंगा:

आर संदर्भ मैनुअल: http://cran.r-project.org/manuals.html

आर संदर्भ कार्ड: http://cran.r-project.org/doc/contrib/Short-refcard.pdf


धन्यवाद! लेकिन मुझे एक और समस्या है। मेरे पास प्रत्येक कॉलम का नाम वर्णों के एक समूह col_names [] में है। मैं उपरोक्त कमांड का उपयोग कैसे कर सकता हूं (न तो mydf$col_names[i]और न ही mydf[,col_names[i]]काम नहीं करता है।)
रसूल

1
@ रासौल, mydf[, col_names]ऐसा करेंगे
DrDom

3
रेफरी के लिए +1। यह मूल सामान है, जिसे पूछना ठीक है, लेकिन इन कामों (और इसी तरह) के कामों में व्यापक काम के बारे में पता होना भी ठीक है।
रोमन लुसट्रिक

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

स्पष्टीकरण। सभी डेटाफ्रेम सूचियां हैं और [कई मूल्यवान तर्कों के साथ उपयोग किए गए परिणाम इसी प्रकार सूचियां हैं, इसलिए सूचियों पर लूप करना कार्य है lapply। उपरोक्त असाइनमेंट उन सूचियों का एक समूह बनाएगा जो फ़ंक्शन data.frame.[<-को सफलतापूर्वक डेटाफ़्रेम में वापस चिपका देना चाहिएdf

एक और रणनीति केवल उन स्तंभों को परिवर्तित करने की होगी जहां अद्वितीय वस्तुओं की संख्या कुछ मानदंड से कम है, आइए उदाहरण के रूप में पंक्तियों की संख्या के लॉग से कम कहें:

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

यह एक बहुत अच्छा समाधान है! यह कॉलम संख्याओं के साथ भी काम कर सकता है जो विशेष रूप से उपयोगी हो सकता है यदि आप कई को बदलना चाहते हैं लेकिन सभी नहीं। जैसे, col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57) फिर df [, col_nums] <- lapply (df [, col_nums]] , कारक)।
WGray

कैविएट: पहला समाधान काम नहीं करता है length(col_names)==1। उस स्थिति में, df[,col_names]स्वचालित रूप से लंबाई 1 की सूची के बजाय एक वेक्टर को आबंटित किया जाता है, और फिर lapplyएक पूरे के रूप में कॉलम के बजाय प्रत्येक प्रविष्टि पर काम करने की कोशिश करता है। इसे इस्तेमाल करके रोका जा सकता है df[,col_names,drop=FALSE]
P Schnell

वह अच्छी बात है। अन्य आह्वान जो सूची की स्थिति को बनाए रखने के लिए उपयोग करना है df[col_names]
IRTFM

27

आप dplyr::mutate_if()सभी वर्ण स्तंभों को बदलने के dplyr::mutate_at()लिए या कारकों के लिए नामांकित वर्ण स्तंभों का चयन करने के लिए उपयोग कर सकते हैं :

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

यदि आप अपना डेटा लोड करने के बाद अपने डेटा में सभी कैरेक्टर वैरिएबल को बदलना चाहते हैं , तो अपना डेटा लोड करने के बाद, आप इसे इस तरह से कर सकते हैं, जैसे data.frame नामक dat:

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

यह एक वेक्टर की पहचान करता है कि कौन से कॉलम कक्षा के हैं character, फिर as.factorउन कॉलमों पर लागू होते हैं।

नमूना डेटा:

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

हर वर्ण चर का पूर्ण रूपांतरण आमतौर पर डेटा में पढ़ते समय होता है, उदाहरण के लिए stringsAsFactors = TRUE, लेकिन यह तब उपयोगी होता है, जब आप कहते हैं, आपने पैकेज read_excel()से डेटा पढ़ा है readxlऔर एक यादृच्छिक वन मॉडल को प्रशिक्षित करना चाहते हैं जो स्वीकार नहीं करता है वर्ण चर।
सैम फिरके

13

एक और संक्षिप्त तरीका जो आप उपयोग कर सकते हैं वह है मैग्ग्रीट पैकेज %<>%से एक पाइप ( ) । यह चरित्र स्तंभ mycolumn को एक कारक में परिवर्तित करता है।

library(magrittr)

mydf$mycolumn %<>% factor

कृपया अधिक जानकारी के साथ संपादित करें। कोड-ओनली एंड "ट्राय दिस" जवाबों को हतोत्साहित किया जाता है, क्योंकि उनमें कोई खोज योग्य सामग्री नहीं होती है, और यह नहीं समझाते कि किसी को "कोशिश" क्यों करनी चाहिए। हम ज्ञान के लिए संसाधन होने के लिए एक प्रयास करते हैं।
ब्रायन टॉम्पसेट -

pls अगर मैं चाहता हूँ कि यह मेरे df के सभी स्तंभों के लिए उपयोग करें?
मुस्तफा

5

मैं यह एक समारोह के साथ कर रहा हूँ। इस मामले में मैं केवल चरित्र चर को कारक में बदलूंगा:

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

मेरा मानना ​​है कि आपको वास्तव में कॉलम को निकालने और इसे एक कारक में बदलने के लिए डबल ब्रैकेट की आवश्यकता है, जैसे[[i]]
RTrain3k
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.