Câu hỏi Bất kỳ cách nào để tự động sửa tất cả các lớp biến trong một khung dữ liệu


Tôi có một khung dữ liệu với khoảng ~ 250 biến. Thật không may, tất cả các biến này được nhập dưới dạng các lớp ký tự từ cơ sở dữ liệu sql bằng cách sử dụng sqldf. Vấn đề: tất cả chúng không phải là các lớp nhân vật. Có các biến số, số nguyên, cũng như ngày tháng. Tôi muốn xây dựng một mô hình chạy trên tất cả các biến và để làm điều này, tôi cần đảm bảo rằng các biến có các lớp đúng. Làm từng cái một có lẽ là tốt nhất, nhưng vẫn rất thủ công.

Làm thế nào tôi có thể tự động sửa tất cả các lớp? Có lẽ một cách để phát hiện xem có các ký tự bảng chữ cái trong cột hoặc chỉ các ký tự số không?

Tôi không nghĩ rằng nó có thể cho một cách tiếp cận tự động để được hoàn hảo trong việc điều chỉnh tất cả các lớp học. Nhưng nó có thể sửa chữa hầu hết các lớp học, sau đó những người không tốt, tôi có thể chăm sóc chúng bằng tay.

Tôi đang thêm một thẻ sqldf trong trường hợp ai biết về bất kỳ cách nào để sửa lỗi này khi nhập dữ liệu, nhưng tôi cho rằng đó không phải lỗi của sqldf mà là của cơ sở dữ liệu.


8
2018-01-04 20:18


gốc




Các câu trả lời:


Điều gần nhất với chuyển đổi loại "tự động" trên khung dữ liệu có thể là

df[] <- lapply(df, type.convert)

Ở đâu df là tập dữ liệu của bạn. Chức năng type.convert() 

Chuyển đổi một vector ký tự thành lô-gic, số nguyên, số, phức hoặc yếu tố thích hợp.

Có một đọc help(type.convert), nó có thể chỉ là những gì bạn muốn.

Theo kinh nghiệm của tôi, type.convert() rất đáng tin cậy. Bạn có thể dùng as.is = TRUE nếu bạn không muốn các nhân vật bị ép buộc bởi các yếu tố. Cộng với nó được sử dụng trong nội bộ trong nhiều hàm R quan trọng (như read.table), vì vậy nó chắc chắn an toàn.

Đây là một ví dụ nhanh về nó hoạt động trên iris. Trước tiên, chúng tôi sẽ thay đổi tất cả các cột thành ký tự, sau đó chạy type.convert() trên đó.

## Original column classes in iris
sapply(iris, class)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#    "numeric"    "numeric"    "numeric"    "numeric"     "factor" 

## Change all columns to character
iris[] <- lapply(iris, as.character)
sapply(iris, class)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#  "character"  "character"  "character"  "character"  "character" 

## Run type.convert()
iris[] <- lapply(iris, type.convert)
sapply(iris, class)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#    "numeric"    "numeric"    "numeric"    "numeric"     "factor" 

Chúng ta có thể thấy rằng các cột được trả lại cho các lớp ban đầu của chúng. Điều này là bởi vì type.convert() ép buộc cột thành loại "thích hợp nhất".


8
2018-01-04 20:35



Xin chào Richard, Gần đây tôi đã sử dụng tính năng này trên một khung dữ liệu khác và nó đã đưa ra lỗi này Error in FUN(X[[i]], ...) : the first argument must be of mode character Tôi đã tự hỏi nếu bạn biết lý do tại sao điều này đang xảy ra - jgozal
có vẻ như type.convert () mong đợi một vector ký tự làm đối số đầu tiên của nó. Tôi đã cố gắng chuyển đổi df của tôi để as.character (df) nhưng sau đó nó chỉ chuyển đổi mọi thứ thành loại yếu tố - jgozal
@jgozal Nếu bạn muốn nhân vật vẫn là nhân vật và không bị ép buộc bởi các yếu tố, hãy đặt as.is=TRUE trong type.convert - Rich Scriven
sẽ không vẫn chuyển đổi các cột khác thành ký tự? - jgozal
@jgozal - Không, bạn sẽ phải làm df[] <- lapply(df, function(x) type.convert(as.character(x), as.is = TRUE))  Bằng cách đó bạn sẽ không có cột yếu tố. Nếu bạn muốn R quyết định về các yếu tố, hãy bỏ qua as.is = TRUE. Bạn không thể chạy as.character() trên một khung dữ liệu, chỉ trên từng vectơ nguyên tử - Rich Scriven