2017-09-14 9 views
6

पैकेज datasets और विभिन्न संकुल उपयोगी डेटासेट भी पर्याप्त मात्रा में साथ आते हैं, लेकिन वहाँ अपने आदर्श डाटासेट लगाने के लिए जब आप अपने पैकेज उदाहरण के लिए इसकी आवश्यकता, शिक्षण उद्देश्यों के लिए, या पूछना/एक सवाल का जवाब करने के लिए कोई आसान तरीका प्रतीत हो रहा है एसओ पर यहाँमैं एक डाटासेट कुछ विशिष्ट गुण होते हैं कि कैसे मिल सकती है?

उदाहरण के लिए कहें मैं एक डेटासेट चाहता हूं जो data.frame है, कम से कम 2 character कॉलम हैं, और 100 पंक्तियों से कम लंबा है।

मैं कैसे हर डाटासेट उपलब्ध का पता लगाने और प्रासंगिक जानकारी की एक अधिकतम मेरी पसंद बनाने के लिए देख सकते हैं?

मेरे अतीत की कोशिश करता गन्दा थे, समय देने के लिए, और कुछ संकुल जो caret की तरह एक असामान्य वस्तु संरचना है साथ दुर्घटनाग्रस्त हो गया।

उत्तर

2

बढ़ाएँ/अपनी पसंद के अनुसार संशोधित।

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

यह सुंदर है ... –

+1

FYI करें मैं यह समारोह मैं, का उपयोग करेंगे मेरी अद्यतन जवाब देखने में फिर से काम किया है। –

1

पैकेज में datasets वहाँ वर्ग data.frame का कोई डाटासेट है कि आपके शर्तों को पूरा करता है, अधिक वास्तव में अगर वे वर्ग data.frame के हैं और सबसे 100 स्तंभों में है, तो उनमें से कोई भी वर्ग character के दो या अधिक स्तंभ है। मैंने अभी पाया है कि निम्नलिखित कोड के पहले संस्करण के साथ।

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" 

इसलिए मुझे कक्षा factor के कॉलम को संभालने के लिए अतिरिक्त निर्देश शामिल करना पड़ा। डिफ़ॉल्ट डेटा फ्रेम stringsAsFactors = TRUE के साथ बनाए जाते हैं। आप उन के साथ क्या कर सकते हैं, वहाँ तुम्हारे पास है, उनके नाम वेक्टर df_names में हैं। उन्हें वैश्विक पर्यावरण में उपलब्ध कराने के लिए बस get जो आप चाहते हैं।

+0

अच्छा धन्यवाद। मुझे लगता है कि अगर इसमें कुछ भी नहीं बनाया गया है तो मैं इसके चारों ओर एक सामान्य समारोह तैयार करूंगा और इसे यहां साझा करूंगा। डेटासेट नाम, वर्णन, कक्षा, लंबाई, प्रत्येक वर्ग की वस्तुओं की संख्या के साथ कुछ डेटा.फ्रेम की तरह। एक 'डेटा' फ़ंक्शन भी है जो डेटासेट को वापस देता है जिसे आप कुछ पैकेजों तक सीमित कर सकते हैं, इसका उपयोग करना दिलचस्प हो सकता है। लेकिन यह आश्चर्य की बात है कि हम जो भी उदाहरण देखते हैं, वह सबसे पहले डेटासेट्स को 100 से अधिक डेटासेट की यादृच्छिक रूप से सूचीबद्ध करने वाले व्यक्ति का परिणाम था, या आपके द्वारा किए गए कस्टम फ़ंक्शन को लिखना था। –

3

मैं @ Eddi के kickass जवाब इतना पर फिर से काम:

  • यह एक समारोह
  • यह कार्यक्षेत्र को अस्त-व्यस्त नहीं करता है (यह सिर्फ data.table लोड करता है)
  • मैं कम करने के लिए कॉलम का नाम बदल कर कुछ और
  • जोड़ा है
  • सूची तत्वों की कक्षाएं भी निरीक्षण किया जाता है
  • मैं वस्तु और डाटासेट शीर्षक
  • annoyin वापसी जी पैकेज चेतावनी

छिपा हो सकता है तुम बस चलाएंगे इस (बशर्ते आप data.table स्थापित किया है):

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

यह caret पैकेज (संपादन इतिहास देखें) समस्याग्रस्त किया जा करने के लिए इस्तेमाल के साथ काम करता

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 

सबसेट है और एक विशिष्ट डेटासेट के लिए देखने के लिए आसान, list वस्तुओं और data.frame स्तंभों की कक्षाएं गिने जाते हैं।

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 

कार्यस्थान साफ ​​है

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

कुछ भी नहीं data.table से अलग लोड किया गया था।

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" 

समारोह

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

तालिका myfun() द्वारा दिया उचित शर्तों के साथ फ़िल्टर किया जा सकता है, और डेटासेट के कॉलम कक्षाएं coulmn में दिए गए अपने वर्ग से पहचाना जा सकता।

caret पैकेज के साथ समस्या यह है कि यह किसी भी डेटा फ्रेम या मैट्रिक्स वस्तु नहीं है कि है। डेटा ऑब्जेक्ट के अंदर caret में डेटासेट मौजूद हो सकते हैं। मुझे इसके बारे में निश्चित नहीं है, caret पैकेज में कुछ सूची ऑब्जेक्ट्स में फ़ंक्शंस की एक सूची है।

इसके अलावा, अगर रुचि रखते हैं, तो आप myfun() समारोह डेटा फ्रेम या मैट्रिक्स वस्तुओं केवल के बारे में जानकारी देने के लिए अधिक विशिष्ट बना सकते हैं।

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 

लोड संकुल पैकेज पर myfun() समारोह लागू करने के बाद उतार दिया करने के लिए की जरूरत है, इस प्रयास करें:

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

मैं वास्तव में 'ls का उपयोग करने का विचार की तरह ('पैकेज: ...')' के रूप में यह अतिरिक्त वस्तुओं के लिए पहुँच देता है, कि नियमित अभिव्यक्ति द्वारा या के साथ एक समारोह को देख तरह से आकर्षक उत्पाद करने के लिए लाभ उठाने हो सकता है थोड़ा अधिक उदाहरण के लिए पैरामीटर द्वारा कार्यों को देखकर काम करें। लेकिन यह समस्याग्रस्त है कि यह कुछ डेटासेट्स को "देख" नहीं देता है, जैसे 'देखभाल' पैकेज वाले। –

संबंधित मुद्दे