2012-02-12 104 views
94

我使用R語言進行編程。我想將我的data.frame對象(mydf)某些列的格式(類)從字符集更改爲因子。當我通過read.table()函數讀取文本文件時,我不想這樣做。任何幫助,將不勝感激。將data.frame列格式從字符轉換爲因子

+6

是myDF $ myfavoritecolumn < - as.factor(myDF上$ myfavoritecolumn) – 2012-02-12 18:21:25

+0

謝謝!但我有另一個問題。我有一個字符數組col_names []中的每列的名稱。如何使用上述命令(mydf $ col_names [i])不起作用。 – Rasoul 2012-02-12 18:35:59

+0

任何方式自動爲所有字符變量做這件事,因爲data.frame與stringsAsFactors做到了嗎? – 2012-10-25 15:21:05

回答

133

嗨歡迎R.

世界
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 I會建議你有看看這兩個網站:

R參考手冊: http://cran.r-project.org/manuals.html

R參考卡:http://cran.r-project.org/doc/contrib/Short-refcard.pdf

+0

謝謝!但我有另一個問題。我有一個字符數組col_names []中的每列的名稱。我怎樣才能使用上面的命令(既不是'mydf $ col_names [i]'也不''mydf [,col_names [i]]'不起作用。) – Rasoul 2012-02-12 18:41:02

+0

@Rasoul,'mydf [,col_names]'會這樣做 – DrDom 2012-02-12 18:49:08

+1

+ 1爲參考。這是基本的東西,這是可以問的,但也很好意識到已經投入到這些(和類似的)作品中的大量工作。 – 2012-02-12 20:25:55

67
# 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) 
+0

其中任何一個都可以工作。我只是通過嘗試'names < - c('vs','am','gear')來僞造你聲稱它「一定是」的說法。 mtcars [,名稱] < - lapply(mtcars [,names],factor)'..也許你應該更加小心批評你的長輩。 – 2014-02-07 20:17:07

+0

這是一個非常好的解決方案!它也可以處理列號,如果你想改變許多但不是全部,這可能特別有用。例如,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 2014-08-08 17:17:21

+0

警告:如果'length(col_names)== 1',第一個解決方案不起作用。在這種情況下,'df [,col_names]'會自動降級爲一個向量,而不是長度爲1的列表,然後'lapply'嘗試對每個條目進行操作,而不是整個列。這可以通過使用'df [,col_names,drop = FALSE]'來防止。 – 2016-09-11 17:14:07

9

如果你想改變在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 
       ) 
+0

當讀取數據時,例如'stringsAsFactors = TRUE',通常會將每個字符變量完全轉換爲因子,但當您從'readxl'讀取數據時使用'read_excel()'讀取數據時非常有用。包並且想要訓練一個不接受字符變量的隨機森林模型。 – 2016-01-07 22:01:18

5

你可以使用另一種短的路是從magrittr包管道(%<>%)。它將字符列mycolumn轉換爲一個因子。

library(magrittr) 

mydf$mycolumn %<>% factor 
+0

請編輯更多信息。僅限代碼和「嘗試這個」的答案是不鼓勵的,因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。我們在這裏努力成爲知識的資源。 – 2016-06-24 11:13:42

+0

請問如果我不想把它用於我的df的所有列? – 2017-01-26 13:50:24

1

我這樣做的功能。在這種情況下,我只會改變字符變量因素:

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