8

列の型に基づいてデータ フレームをサブセット化する必要があります。たとえば、100 列のデータ フレームからは、型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. 要求されたすべてのタイプおよびデータ フレーム内のすべての列に対して、「is.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分前に機能を終了しました)。

4

2 に答える 2

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")))
于 2013-07-31T07:58:22.987 に答える