2017-09-14 3 views
6

Das Paket datasets und verschiedene Pakete werden mit einer guten Menge nützlicher Datensätze geliefert. Es scheint jedoch keinen einfachen Weg zu geben, Ihr perfektes Dataset zu finden, wenn Sie es für Ihre Paketbeispiele, für Unterrichtszwecke oder zum Stellen/Beantworten einer Frage benötigen hier auf SO.Wie kann ich ein Dataset mit bestimmten Attributen finden?

Zum Beispiel möchte ich eine Datenmenge, die eine data.frame ist, hat mindestens 2 character Spalten und ist weniger als 100 Zeilen lang.

Wie kann ich ALLE verfügbaren Datensätze durchsuchen und ein Maximum an relevanten Informationen sehen, um meine Auswahl zu treffen?

Meine früheren Versuche waren chaotisch, nahmen sich Zeit und stürzten mit einigen Paketen ab, die eine ungewöhnliche Objektstruktur wie caret haben.

Antwort

2

nach Ihren Wünschen erweitern/ändern.

library(data.table) 
dt = as.data.table(data(package = .packages(all.available = TRUE))$results) 
dt = dt[, `:=`(Item = sub(' \\(.*', '', Item), 
       Object = sub('.*\\((.*)\\)', '\\1', Item))] 

dt[, { 
     data(list = Object, package = Package) 
     d = eval(parse(text = Item)) 

     classes = if (sum(class(d) %in% c('data.frame')) > 0) unlist(lapply(d, class)) 
       else NA_integer_ 

     .(class = paste(class(d), collapse = ","), 
     nrow  = if (!is.null(nrow(d))) nrow(d) else NA_integer_, 
     ncol  = if (!is.null(ncol(d))) ncol(d) else NA_integer_, 
     charCols = sum(classes == 'character'), 
     facCols = sum(classes == 'factor')) 
    } 
    , by = .(Package, Item)] 
#  Package   Item            class nrow ncol charCols facCols 
# 1: datasets AirPassengers             ts NA NA  NA  NA 
# 2: datasets  BJsales             ts NA NA  NA  NA 
# 3: datasets BJsales.lead             ts NA NA  NA  NA 
# 4: datasets   BOD           data.frame 6 2  0  0 
# 5: datasets   CO2 nfnGroupedData,nfGroupedData,groupedData,data.frame 84 5  0  3 
# ---                          
#492: survival transplant           data.frame 815 6  0  3 
#493: survival  uspop2            array 101 2  NA  NA 
#494: survival  veteran           data.frame 137 8  0  1 
#495: viridis viridis.map           data.frame 1024 4  1  0 
#496: xtable   tli           data.frame 100 5  0  3 
+0

das ist schön ... –

+1

FYI Ich habe es in die Funktion überarbeitet, die ich verwenden werde, siehe meine aktualisierte Antwort. –

1

Im Paket datasets gibt es keinen Datensatz von Klasse data.frame, die Ihre Bedingungen erfüllt, genauer gesagt, wenn sie der Klasse sind data.frame und haben höchstens 100 Spalten, dann hat keiner von ihnen zwei oder mehr Spalten der Klasse character. Ich habe das gerade mit einer ersten Version des folgenden Codes herausgefunden.

library(datasets) 
res <- library(help = "datasets") 

dat <- unlist(lapply(strsplit(res$info[[2]], " "), '[[', 1)) 
dat <- dat[dat != ""] 
df_names <- NULL 
for(i in seq_along(dat)){ 
    d <- tryCatch(get(dat[i]), error = function(e) e) 
    if(inherits(d, "data.frame")){ 
     if(nrow(d) <= 100){ 
      char <- sum(sapply(d, is.character)) 
      fact <- sum(sapply(d, is.factor)) 
      if(char >= 2 || fact >= 2){ 
       print(dat[i]) 
       df_names <- c(df_names, dat[i]) 
      } 
     } 
    } 
} 

df_names 
[1] "CO2"  "esoph"  "npk"  "sleep"  "warpbreaks" 

Also musste ich zusätzliche Anweisungen enthalten Spalten der Klasse zu behandeln factor. Standardmäßig werden Datenrahmen mit stringsAsFactors = TRUE erstellt. Wenn Sie mit denen tun können, dort haben Sie es, sind ihre Namen in Vektor df_names. Um sie in der globalen Umgebung verfügbar zu machen, brauchen Sie nur get.

+0

Schön danke. Ich denke, wenn nichts eingebaut ist, baue ich eine allgemeine Funktion um es herum und teile es hier. Wie einige data.frame mit Dataset-Name, Beschreibung, Klasse, Länge, Anzahl der Elemente jeder Klasse. Es gibt auch eine "Daten" -Funktion, die die Datensätze zurückgibt, die Sie auf einige Pakete beschränken können, es kann interessant sein, sie zu verwenden. Aber es ist für mich überraschend, dass jedes Beispiel, das wir mit einem Datum sehen, das Ergebnis einer Person ist, die zufällig Listen von 100s von Datasets durchsucht oder eine benutzerdefinierte Funktion schreibt wie Sie. –

3

I Kickass @ eddi Antwort überarbeitet so:

  • Es ist eine Funktion
  • Es ist nicht auf den Arbeitsbereich Krempel hat (es gerade lädt data.table)
  • I Spalten kürzer umbenannt und fügte etwas mehr
  • Klassen der Listenelemente sind auch
  • ich das Objekt und Daten-Set Titel
  • annoyin inspiziert Rückkehr g Paket Warnungen können

versteckt werden Sie müssen nur laufen diese (vorausgesetzt, Sie haben data.table installiert ist):

ds <- dataset_summary() # around 5 seconds if you have a lot of packages like me 

Es arbeitet mit dem caret Paket, das problematisch zu sein verwendet (Editierhistorie sehen)

subset(ds,Package == "caret") 
#  Package   Object    Item             Title  class nrow ncol char fact ord num int list df 
# 143 caret  GermanCredit  GermanCredit          German Credit Data data.frame 1000 62 0 1 0 54 7 0 0 
# 144 caret  Sacramento  Sacramento        Sacramento CA Home Prices data.frame 932 9 0 3 0 3 3 0 0 
# 145 caret   tecator   absorp   Fat, Water and Protein Content of Meat Samples  matrix 215 100 NA NA NA NA NA NA NA 
# 146 caret  BloodBrain   bbbDescr        Blood Brain Barrier Data data.frame 208 134 0 0 0 118 16 0 0 
# 147 caret    cars    cars Kelly Blue Book resale data for 2005 model year GM cars data.frame 804 18 0 0 0 1 17 0 0 
# 148 caret    cox2  cox2Class          COX-2 Activity Data  factor NA NA NA NA NA NA NA NA NA 

einfach für einen bestimmten Datensatz Teilmenge und schauen, Klassen list Elemente und data.frame Spalten gezählt.

subset(ds,class == 'list' & df > 0,select=-c(2,4)) 
#   Package   Item class nrow ncol char fact ord num int list df 
# 225  ecodist  iris.fit list NA NA 0 0 0 1 0 0 1 
# 238 ElemStatLearn orange10.test list NA NA 0 0 0 0 0 0 50 
# 239 ElemStatLearn orange10.train list NA NA 0 0 0 0 0 0 50 
# 240 ElemStatLearn orange4.test list NA NA 0 0 0 0 0 0 50 
# 241 ElemStatLearn orange4.train list NA NA 0 0 0 0 0 0 50 
# 346   lava missingdata list NA NA 0 0 0 0 0 0 4 

Arbeitsbereich ist sauber

ls() 
# [1] "dataset_summary" "ds" 

Nichts von data.table geladen abgesehen wurde.

search() 
# [1] ".GlobalEnv"   "package:data.table" "package:Matrix"  "package:sp"   "package:timeSeries" "package:timeDate" 
# [7] "tools:rstudio"  "package:stats"  "package:graphics" "package:grDevices" "package:utils"  "package:datasets" 
# [13] "package:methods" "Autoloads"   "package:base" 

Die Funktion

dataset_summary <- function(silent = TRUE){ 
    if(silent){ 
    w <- options()$warn 
    options(warn = -1) 
    on.exit(options(warn = w)) 
    } 
    ws <- ls(envir=.GlobalEnv) 
    library(data.table) 
    dt = as.data.table(data(package = .packages(all.available = TRUE))$results) 
    dt = dt[, `:=`(Item = sub(' \\(.*', '', Item), 
       Object = sub('.*\\((.*)\\)', '\\1', Item))] 

    df <- as.data.frame(dt[, { 
    data(list = Object, package = Package) 
    d = eval(parse(text = Item)) 

    classes = if (sum(class(d) %in% c('data.frame','list')) > 0) unlist(lapply(d, class)) 
    else NA_integer_ 

    .(class = paste(class(d), collapse = ","), 
     nrow  = if (!is.null(nrow(d))) nrow(d) else NA_integer_, 
     ncol  = if (!is.null(ncol(d))) ncol(d) else NA_integer_, 
     char  = sum(classes == 'character'), 
     fact  = sum(classes == 'factor'), 
     ord  = sum(classes == 'ordered'), 
     num  = sum(classes == 'numeric'), 
     int  = sum(classes == 'integer'), 
     list  = sum(classes == 'list'), 
     df  = sum(classes == 'data.frame')) 
    } 
    , by = .(Package, Item)]) 
    rm(list=setdiff(ls(envir=.GlobalEnv),ws),envir=.GlobalEnv) 
    df 
} 
1

Die durch myfun() zurück Tabelle kann mit geeigneten Bedingungen gefiltert werden, und die Spalten der Datensätze können in der Klassen coulmn gegeben durch seine Klasse identifiziert werden. Das Problem mit caret Paket ist, dass es keine Datenrahmen oder Matrix-Objekt darin hat. Die Datensätze können in dem caret innerhalb des List-Objekts vorhanden sein. Ich bin mir nicht sicher, einige Listenobjekte im caret Paket enthalten eine Liste von Funktionen.

Wenn Sie interessiert sind, können Sie auch die Funktion myfun() für die Rückgabe von Informationen zu Datenrahmen oder Matrixobjekten festlegen.

myfun <- function(package) 
{ 
    t(sapply(ls(paste0('package:', package)), function(x){ 
    y <- eval(parse(text = paste0(package, "::`", x, "`"))) 
    data.frame(data_class = paste0(class(y), collapse = ","), 
       nrow = ifelse(any(class(y) %in% c("data.frame", "matrix")), 
           nrow(y), 
           NA_integer_), 
       ncol = ifelse(any(class(y) %in% c("data.frame", "matrix")), 
           ncol(y), 
           NA_integer_), 
       classes = ifelse(any(class(y) %in% c("data.frame", "matrix")), 
            paste0(unlist(lapply(y, class)), collapse = ","), 
            NA), 
       stringsAsFactors = FALSE) 

    })) 
} 

library(datasets) 
meta_data <- myfun(package = "datasets") 
head(meta_data) 
#    data_class nrow ncol classes               
# ability.cov "list"  NA NA NA                
# airmiles  "ts"   NA NA NA                
# AirPassengers "ts"   NA NA NA                
# airquality "data.frame" 153 6 "integer,integer,numeric,integer,integer,integer"     
# anscombe  "data.frame" 11 8 "numeric,numeric,numeric,numeric,numeric,numeric,numeric,numeric" 
# attenu  "data.frame" 182 5 "numeric,numeric,factor,numeric,numeric" 

meta_data[ "ChickWeight", ] 
# $data_class 
# [1] "nfnGroupedData,nfGroupedData,groupedData,data.frame" 
# 
# $nrow 
# [1] 578 
# 
# $ncol 
# [1] 4 
# 
# $classes 
# [1] "numeric,numeric,ordered,factor,factor" 

library('caret') 
meta_data <- myfun(package = "caret") 
#    data_class nrow ncol classes 
# anovaScores "function" NA NA NA  
# avNNet  "function" NA NA NA  
# bag   "function" NA NA NA  
# bagControl "function" NA NA NA  
# bagEarth  "function" NA NA NA  
# bagEarthStats "function" NA NA NA 

Wenn die geladenen Pakete nach dem Auftragen der myfun() Funktion auf der Verpackung entladen muss, versuchen Sie dies:

loaded_pkgs <- search() 
library('caret') 
meta_data <- myfun(package = "caret") 
unload_pkgs <- setdiff(search(), loaded_pkgs) 
for(i in unload_pkgs) { 
    detach(pos = which(search() %in% i)) 
} 
+0

Ich mag wirklich die Idee, 'ls ('package: ...')' zu verwenden, da es Zugriff auf zusätzliche Objekte gibt, die für mehr coole Dinge wie das Nachschlagen einer Funktion durch regulären Ausdruck oder mit ein bisschen mehr genutzt werden können arbeiten nach Funktionen nach Parameter suchen. Aber es ist problematisch, dass es einige Datensätze nicht "sieht", wie die aus dem "Caret" -Paket. –

Verwandte Themen