2013-07-31 5 views
7

Мне нужно подмножить фрейм данных на основе типа столбца - например, из фрейма данных со 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. Для каждого запрашиваемого типа и для каждого столбца в вызове фрейма данных «есть. 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

Я не уверен, что я полностью понимаю ваш вопрос, но почему бы не только что-то вроде 'ф.р. [sapply (Д.Ф., функция (х) is.integer (x) || logical (x))] '? – A5C1D2H2I1M1N2O1R2T1

+0

Я часто занимаюсь подобным подмножеством, поэтому я попытался создать эту функцию - упростить свою жизнь. –

+2

Btw., Почему вы должны включить загрузку этого довольно большого 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

Смежные вопросы