2013-07-31 34 views
7

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:

  1. Đố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
  2. Tổng kiểm tra cho mỗi biến (boolean được đúc thành số nguyên tự động)
  3. Kết quả truyền cho vector lôgic
  4. 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).

+1

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

+0

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. –

+2

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

Trả lời

2
subset_colclasses <- function(DF, colclasses="numeric") { 
    DF[,sapply(DF, function(vec, test) class(vec) %in% test, test=colclasses)] 
} 

str(subset_colclasses(df, c("factor", "integer"))) 
13

Chỉ cần làm như sau:

df[,sapply(df,is.factor) | sapply(df,is.integer)] 
+0

làm cách nào tôi làm điều gì đó như df [, sapply (df,! is.list)] ???? (nhận được tất cả các cột KHÔNG danh sách) – userJT

+0

@userJT 'df [, sapply (df, hàm (x)! is.list (x))]' – Thomas

+0

Tôi cũng phát hiện ra trong thời gian chờ đợi rằng điều này làm việc df2 <-df [ ,! sapply (df, is.list)] – userJT

Các vấn đề liên quan