2013-07-31 18 views
7

カラムタイプに基づいてデータフレームをサブセット化する必要があります。たとえば、カラム数が1003のデータフレームからは、factorまたはintegerのカラムのみを保持する必要があります。私はこれを行うための短い関数を書いたが、よりシンプルな解決法や、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. 結果を論理ベクトルにキャストします
  4. サブセットデータフレーム内の名前

そして、それをテストするためのいくつかのデータ:

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

Btw。なぜ、このかなり大きなdata.frameを再現可能な例でダウンロードする必要がありますか?次回は、組み込みデータセットの1つを使用するだけです。 – 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

関連する問題