2013-07-31 103 views
7

我需要基於列類型的子集數據框 - 例如從具有100列的數據框中,我只需要保留那些類型爲factorinteger的列。我已經寫了一個簡短的函數來做到這一點,但在CRAN中是否有更簡單的解決方案或一些內置函數或包?基於列類型的數據框中的子集變量

我目前的解決方案,使變量名與請求的類型:

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))] 
} 

功能varlist工作如下:

  1. 對於每一個請求的類型和數據幀通話每列「是。 TYPE「功能
  2. 對每個變量進行求和測試(布爾值自動轉換爲整數)
  3. 將結果轉換爲邏輯向量在數據幀

  • 子集的名字和一些數據來測試它:

    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")) 
    

    我這麼問是因爲我的代碼看起來很神祕,很難理解(甚至對我來說,我已經10分鐘前完成功能)。

  • +1

    我不知道我完全理解你的問題,但爲什麼不只是像'DF [sapply(DF,函數(X)is.integer( x)|| is.logical(x))]'? – A5C1D2H2I1M1N2O1R2T1

    +0

    我經常這樣做子集,這就是爲什麼我試圖創建這個功能 - 簡化我的生活。 –

    +2

    順便說一句,爲什麼你必須包括下載這個相當大的data.frame在你可重複的例子?下次您應該只使用其中一個內置數據集。 – Roland

    回答

    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

    只需做到以下幾點:

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

    我將如何執行類似於df [,sapply( df,!is.list)] ???? (得到所有不是列表的列) – userJT

    +0

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

    +0

    我同時發現這個工作df2 <-df [ ,!sapply(df,is.list)] – userJT

    相關問題