Chuyển đổi định dạng cột data.frame từ ký tự sang yếu tố


153

Tôi muốn thay đổi định dạng (lớp) của một số cột của đối tượng data.frame ( mydf) của tôi từ charactor thành yếu tố .

Tôi không muốn làm điều này khi tôi đang đọc tệp văn bản theo read.table()chức năng.

Bất kỳ trợ giúp sẽ được đánh giá cao.


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

Cảm ơn! nhưng tôi có một vấn đề khác Tôi có tên của mỗi cột trong một mảng các ký tự col_names []. Làm cách nào tôi có thể sử dụng lệnh trên (mydf $ col_names [i]) không hoạt động.
Rasoul

Bất kỳ cách nào để thực hiện điều này tự động cho tất cả các biến ký tự, như data.frame thực hiện với chuỗiAsFactors?
Etienne Low-Décarie

@ EtienneLow-Décarie: chỉ unclassvà sử dụng data.framevào kết quả ,.
IRTFM

Câu trả lời:


197

Chào mừng đến với thế giới của 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

Điều này cũng hoạt động cho nhân vật, ngày, số nguyên và các lớp khác

Vì bạn chưa quen với R nên tôi khuyên bạn nên xem hai trang web này:

Hướng dẫn tham khảo R: http://cran.r-project.org/manuals.html

R Thẻ tham khảo: http://cran.r-project.org/doc/contrib/Short-refcard.pdf


Cảm ơn! nhưng tôi có một vấn đề khác Tôi có tên của mỗi cột trong một mảng các ký tự col_names []. Làm cách nào tôi có thể sử dụng lệnh trên (không phải mydf$col_names[i]cũng mydf[,col_names[i]]không hoạt động.)
Rasoul

1
@Rasoul, mydf[, col_names]sẽ làm điều này
DrDom

3
+1 cho các lượt giới thiệu. Đây là công cụ cơ bản, có thể hỏi, nhưng cũng tốt để biết về công việc mở rộng đã được đưa vào các tác phẩm (và tương tự) này.
Roman Luštrik

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)

Giải trình. Tất cả các tệp dữ liệu là danh sách và kết quả [được sử dụng với nhiều đối số có giá trị là danh sách tương tự, do đó, việc lặp qua danh sách là nhiệm vụ của lapply. Nhiệm vụ trên sẽ tạo ra một tập hợp các danh sách mà hàm data.frame.[<-sẽ thành công trở lại vào khung dữ liệu,df

Một chiến lược khác là chỉ chuyển đổi các cột trong đó số lượng mục duy nhất ít hơn một số tiêu chí, giả sử ít hơn nhật ký của số lượng hàng làm ví dụ:

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

Đây là một giải pháp rất hay! Nó cũng có thể hoạt động với các số cột có thể đặc biệt hữu ích nếu bạn muốn thay đổi nhiều nhưng không phải tất cả. Ví dụ: col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57) sau đó df [, col_nums] <- lapply (df [, col_nums] , hệ số).
WGray

Hãy cẩn thận: giải pháp đầu tiên không hoạt động nếu length(col_names)==1. Trong trường hợp đó, df[,col_names]được tự động hạ cấp thành một vectơ thay vì danh sách có độ dài 1, và sau đó lapplycố gắng hoạt động trên mỗi mục thay vì toàn bộ cột. Điều này có thể được ngăn chặn bằng cách sử dụng df[,col_names,drop=FALSE].
P Schnell

Đó là một điểm tốt. Lệnh gọi khác sẽ giữ trạng thái danh sách là sử dụng df[col_names].
IRTFM

27

Bạn có thể sử dụng dplyr::mutate_if()để chuyển đổi tất cả các cột ký tự hoặc dplyr::mutate_at()để chọn các cột ký tự được đặt tên thành các yếu tố:

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

Nếu bạn muốn thay đổi tất cả các biến ký tự trong data.frame của mình thành các yếu tố sau khi bạn đã tải dữ liệu của mình, bạn có thể làm như thế này, thành data.frame được gọi là dat:

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

Điều này tạo ra một vectơ xác định các cột nào thuộc lớp character, sau đó áp dụng as.factorcho các cột đó.

Dữ liệu mẫu:

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

Việc chuyển đổi hoàn toàn mọi biến ký tự thành yếu tố thường xảy ra khi đọc dữ liệu, ví dụ, với stringsAsFactors = TRUE, nhưng điều này hữu ích khi bạn đọc dữ liệu read_excel()từ readxlgói và muốn huấn luyện một mô hình rừng ngẫu nhiên không chấp nhận biến ký tự.
Sam Firke

13

Một cách ngắn khác bạn có thể sử dụng là một đường ống ( %<>%) từ gói magrittr . Nó chuyển đổi cột ký tự mycolumn thành một yếu tố.

library(magrittr)

mydf$mycolumn %<>% factor

Vui lòng chỉnh sửa với nhiều thông tin hơn. Các câu trả lời chỉ dành cho mã và "thử cái này" không được khuyến khích, vì chúng không chứa nội dung có thể tìm kiếm và không giải thích lý do tại sao một người nào đó nên "thử cái này". Chúng tôi nỗ lực ở đây để trở thành một nguồn tài nguyên cho kiến ​​thức.
Brian Tompsett - 汤

Xin vui lòng nếu tôi muốn sử dụng nó cho tất cả các cột của df của tôi?
Mostafa

5

Tôi đã làm điều đó với một chức năng. Trong trường hợp này tôi sẽ chỉ chuyển đổi các biến ký tự thành yếu tố:

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

Tôi tin rằng bạn cần dấu ngoặc kép để thực sự trích xuất các cột và thay đổi nó thành một yếu tố, ví dụ[[i]]
RTrain3k
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.