Tôi cần phải đặt khung dữ liệu dựa trên loại cột - ví dụ từ khung dữ liệu với 100 cột Tôi chỉ cần giữ những cột đó với loại factor
hoặc integer
. Tôi đã viết một chức năng ngắn để làm điều này, nhưng có bất kỳ giải pháp đơn giản hơn hoặc một số chức năng hoặc gói tích hợp trên CRAN không?Biến tập hợp con trong khung dữ liệu dựa trên loại cột
giải pháp hiện tại của tôi để có được tên biến với các loại yêu cầu:
varlist <- function(df=NULL, vartypes=NULL) {
type_function <- c("is.factor","is.integer","is.numeric","is.character","is.double","is.logical")
names(type_function) <- c("factor","integer","numeric","character","double","logical")
names(df)[as.logical(sapply(lapply(names(df), function(y) sapply(type_function[names(type_function) %in% vartypes], function(x) do.call(x,list(df[[y]])))),sum))]
}
Chức năng varlist
công trình như sau:
- Đối với tất cả các loại yêu cầu và cho mỗi cột trong cuộc gọi khung dữ liệu "này. TYPE "chức năng
- Tổng kiểm tra cho mỗi biến (boolean được đúc thành số nguyên tự động)
- Kết quả truyền cho vector lôgic
- tên tập con trong khung dữ liệu
Và một số dữ liệu để kiểm tra nó:
df <- read.table(file="http://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/german.data", sep=" ", header=FALSE, stringsAsFactors=TRUE)
names(df) <- c('ca_status','duration','credit_history','purpose','credit_amount','savings', 'present_employment_since','installment_rate_income','status_sex','other_debtors','present_residence_since','property','age','other_installment','housing','existing_credits', 'job','liable_maintenance_people','telephone','foreign_worker','gb')
df$gb <- ifelse(df$gb == 2, FALSE, TRUE)
df$property <- as.character(df$property)
varlist(df, c("integer","logical"))
Tôi hỏi vì mã của tôi trông thật sự khó hiểu và khó hiểu (ngay cả đối với tôi và tôi đã đã hoàn thành chức năng 10 phút trước).
Tôi không chắc tôi hoàn toàn hiểu câu hỏi của bạn, nhưng tại sao không chỉ một cái gì đó như 'df [sapply (df, function (x) is.integer (x) || is.logical (x))] '? – A5C1D2H2I1M1N2O1R2T1
Tôi thường xuyên làm điều này, đó là lý do tại sao tôi đã cố gắng tạo ra chức năng này - để đơn giản hóa cuộc sống của tôi. –
Btw., Tại sao bạn phải bao gồm tải xuống dữ liệu khá lớn này trong ví dụ tái sản xuất của bạn? Lần tới, bạn chỉ nên sử dụng một trong các bộ dữ liệu dựng sẵn. – Roland