Ich brauche Teilmenge Datenrahmen basierend auf Spaltentyp - zum Beispiel aus Datenrahmen mit 100 Spalten Ich muss nur die Spalte mit Typ factor
oder integer
halten. Ich habe eine kurze Funktion dafür geschrieben, aber gibt es eine einfachere Lösung oder eine eingebaute Funktion oder ein Paket auf CRAN?Subset Variablen im Datenrahmen basierend auf Spaltentyp
Meine aktuelle Lösung Variablennamen mit angeforderten Typen zu bekommen:
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))]
}
Die Funktion varlist
funktioniert wie folgt:
- Für jeden gewünschten und für jede Spalte in Datenrahmen Call „ist. TYPE "Funktion
- Summe Tests für jede Variable (Boolean wird automatisch in Integer umgewandelt)
- Ergebnis auf logischen Vektor umwandeln
- Teilmenge Namen in Datenrahmen
Und einige Daten, die es zu testen:
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"))
Ich frage, weil mein Code wirklich kryptisch und schwer zu verstehen (auch für mich sieht, und ich habe beendete die Funktion vor 10 Minuten).
Ich bin nicht sicher, ich Ihre Frage verstehen, aber warum nicht nur so etwas wie 'df [sapply (df, Funktion (x) is.integer (x) || is.logisch (x))]? – A5C1D2H2I1M1N2O1R2T1
Ich mache diese Art von Subsetting häufig, deshalb habe ich versucht, diese Funktion zu erstellen - um mein Leben zu vereinfachen. –
Btw., Warum müssen Sie dieses ziemlich große data.frame in Ihr reproduzierbares Beispiel herunterladen? Beim nächsten Mal sollten Sie nur einen der integrierten Datensätze verwenden. – Roland