2015-08-17 4 views
7

Ich möchte die Datensätze aller verfügbaren (= installierten) Pakete durchlaufen und herausfinden, ob diese Datensätze 6 oder mehr Spalten haben. Hier ist mein Versuch:Wie kann man alle Datensätze durchlaufen (und ihre Anzahl an Spalten bestimmen)?

dat.list <- data(package=.packages(all.available=TRUE))$results # list of all installed packages 
colnames(dat.list) # "Package" "LibPath" "Item" (= name of data set) "Title" (= description) 
idx <- c() 
i <- 3 
## for(i in nrow(dat.list)) { 
    nme <- dat.list[[i,"Item"]] # data set as string 
    data(list=nme, package=dat.list[[i,"Package"]]) # load the data 
    ## => fails with warning: In data(list = nme, package = dat.list[[i, "Package"]]) : 
    ## data set 'BJsales.lead (BJsales)' not found 
    dat <- eval(as.name(nme)) # assign the data to the variable dat 
    ncl <- ncol(dat) 
    if(!is.null(ncl) && ncl >= 6) idx <- c(idx, i) 
## } 

Es offensichtlich nicht funktioniert, so dass ich fixierte einen Index (hier: 3), um zu sehen, was fehlschlägt. Wie kann ich (wenn nicht über nme oben) den Namen des Datensatzes ermitteln, um den Datensatz in einer Variablen zu speichern und dann auf die Anzahl der Spalten zugreifen?

UPDATE die Beiträge von jeremycg und nico Kombination kam ich mit diesem nach oben (wieder: nicht perfekt in die Namen der Datensätze herauszufinden, aber es läuft durch):

dat.list <- data(package=.packages(all.available=TRUE))$results # list of all installed packages 
idx <- c() 
for (i in 1:nrow(dat.list)) 
{ 
    require(dat.list[i, "Package"], character.only=TRUE) 
    raw.name <- dat.list[i, "Item"] # data set (and parenthetical suffix) as raw string 
    name <- gsub('\\s.*','', raw.name) # name of data set 
    dat <- tryCatch(get(name), error=function(e) e) # assign the data to the variable dat (if not erroneous) 
    if(is(dat, "simpleError")) { 
     warning("Element ",i," threw an error") 
     dat <- NA 
    } 
    ncl <- ncol(dat) 
    if(!is.null(ncl) && ncl >= 6) 
     idx <- c(idx, i) 
} 
dat.list[idx, c("Package", "Item")] 
+1

Es gibt eine [ähnliche Frage hier] (http://stackoverflow.com/questions/30684322/r-how-to- Get-a-Dataset-mit-Leerzeichen-in-seinem-Namen), das Problem ist, dass einige Datasets ein Suffix in Klammern haben, anstatt Ihren Code. Siehe den Link für eine Lösung – jeremycg

Antwort

2

Ich denke, dass Sie das Paket laden müssen, um auf die Daten zugreifen zu können.

Sie müssen also am Anfang der Schleife hinzuzufügen:

require(dat.list[[i, "Package"]], character.only = TRUE) 

(siehe this question dafür, warum Sie die charachter.only Variable verwenden müssen)

Beachten Sie, dass Sie benötigen, um Ihre Schleife zu ändern aus :

for(i in nrow(dat.list)) 

zu

for(i in 1:nrow(dat.list)) 

Es gibt ein weiteres Problem: Einige Datensätze werden mit dem Namen auch in Klammern zurückgegeben. Zum Beispiel:

wine.classes (wine) 

Also müssen wir diese ausstreifen. Leicht durchgeführt unter Verwendung:

dat.list[,3] <- sapply(strsplit(dat.list[,3], " "), function(x){x[1]}) 

Schließlich dat.list nur zugegriffen werden kann [] verwenden, keine Notwendigkeit von [[]] (leichter zu lesen!).

So, endlich:

# List of all installed packages 
dat.list <- data(package=.packages(all.available=TRUE))$results 

# Remove package name in parentheses 
dat.list[,3] <- sapply(strsplit(dat.list[, "Item"], " "), 
     function(x){x[1]}) 

idx <- c() 
for (i in 1:nrow(dat.list)) 
    { 
    require(dat.list[i, "Package"], character.only = T) 
    nme <- dat.list[i,"Item"] # data set as string 
    data(list=nme, package=dat.list[i,"Package"]) # load the data 

    dat <- eval(as.name(nme)) # assign the data to the variable dat 
    ncl <- ncol(dat) 
    if(!is.null(ncl) && ncl >= 6) 
     idx <- c(idx, i) 
    } 

Und:

> dat.list[idx, "Item"] 
[1] "Seatbelts"   "USJudgeRatings"  "WorldPhones"  "airquality"   
[5] "anscombe"   "attitude"   "crimtab"   "euro.cross"   
[9] "infert"    "longley"   "mtcars"    "occupationalStatus" 
[13] "state.x77"   "swiss"    "volcano"   "car.test.frame"  
[17] "car90"    "solder"    "stagec"    "bladder"   
[21] "bladder1"   "bladder2"   "cancer"    "cgd"    
[25] "cgd0"    "colon"    "flchain"   "heart"    
[29] "jasa"    "jasa1"    "kidney"    "lung"    
[33] "mgus"    "mgus1"    "mgus2"    "nwtco"    
[37] "ovarian"   "pbc"    "pbcseq"    "rats2"    
[41] "transplant"   "veteran"   "soldat"    "patch"    
[45] "tooth"    
+0

Hallo nico, vielen Dank für Ihre Hilfe. Ich habe definitiv 'require' vergessen (ich hatte es vorher schon benutzt) und die 'for'-Schleife durcheinander gebracht. Aber wenn ich Ihre Version ausführen, bekomme ich 'Fehler in eval (expr, envir, enclos) (von # 6): Objekt 'Delta' nicht gefunden 'und viele Warnungen, dass Datensätze nicht gefunden werden. Ich nehme an, es liegt daran, dass die Datensätze selbst unterschiedlich benannt sind und 'strsplit()' nicht unbedingt den richtigen Namen liefert, aber ich denke, es gibt nicht viel, was man tun kann ... Ich habe mir auch einen Vorschlag von jeremycg angesehen dann kombiniert deine zwei Lösungen (immer noch nicht perfekt, aber zumindest läuft es durch), siehe mein Update –

Verwandte Themen