автоматическое индексирование списка наборов данных из выбранных пакетов в R - PullRequest
2 голосов
/ 14 марта 2012

Я пытаюсь проиндексировать все наборы данных из набора пакетов. Следующий код, ошибки, но я не понимаю, почему:

pn<-c("robust","rrcov","robustbase")
for(j in 1:length(pn)){
    a1<-length(data(package=pn[j])$results[,3])
    for(i in 1:a1){
        data(cat(as.vector(data(package=pn[j])$results[i,3]),"\n"),package=as.character(pn[j]))
        print(dim(cat(as.vector(data(package=pn[j])$results[i,3]),"\n")))
    }
}

Edit:

что я хотел бы, по сути, это загрузить набор данных, чтобы, скажем, проверить его размер (например, для пары wood, robustbase)

data(wood,package="robustbase")
dim(wood)
>20 6

будет загружать "wood" из robustbase, но для j = 3, i = 38 функция, приведенная выше, возвращает:

Warning message:
In data(cat(as.vector(data(package = pn[j])$results[i, 3]), "\n"),  :
  data set ‘cat(as.vector(data(package = pn[j])$results[i, 3]), "\n")’ not found

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Использование того же набора пакетов, что и у Марка

pn<-c("ggplot2","plyr","reshape")

for (package in pn) {
    datasets <- data(package=package)$results[,"Item"]
    for (d in datasets) {
        cat(package, "\t", d, "\t")
        print(dim(eval(parse(text=paste(package,"::",d,sep="")))))
    }
}

Я повторяю немного по-другому, зацикливаясь на векторах напрямую (что сохраняет реиндексацию в векторе). Однако я использую eval(parse(text=...)), что часто свидетельствует о том, что это не лучший подход (см. fortune(106)):

Если ответом является parse (), вы обычно должны переосмыслить вопрос. - Томас Ламли R-help (февраль 2005 г.)

Результаты этого цикла:

ggplot2      diamonds   [1] 53940    10
ggplot2      economics  [1] 478   6
ggplot2      midwest    [1] 437  28
ggplot2      movies     [1] 58788    24
ggplot2      mpg    [1] 234  11
ggplot2      msleep     [1] 83 11
ggplot2      presidential   [1] 10  4
ggplot2      seals  [1] 1155    4
plyr     baseball   [1] 21699    22
plyr     ozone  [1] 24 24 72
reshape      french_fries   [1] 696   9
reshape      smiths     [1] 2 5
reshape      tips   [1] 244   7
1 голос
/ 18 марта 2012

С этим кодом я получаю намного лучшие результаты: код, выложенный Марком Миллером, работает отлично на трех примерах, которые мы использовали для иллюстрации, но почему-то не удается перечислить все наборы данных ....

rm(list=ls())
library("session")
#AAA002<-data(package=.packages(all.available=TRUE))$results[,3]
AAA001<-unique(data(package=.packages(all.available=TRUE))$results[,1])

AAA000<-rep(NA,4)
AAA005<-AAA004<-NA
for(AAA003 in AAA001){#AAA003<-AAA001[3]
    script<-paste("library(",AAA003,")",sep="") 
    printed(script)
    AAA002<-data(package=AAA003) 
    data(list=AAA002$results[,3]) 
    AAA004<-ls()[-c(1:6)]
    for(AAA005 in AAA004){#j<-AAA004[11]
        script<-paste("dim(",AAA005,")",sep="")
        result<-strsplit(printed(script)," ")
        result<-as.numeric(c(result[[1]][2],result[[1]][length(result[[1]])]))
        AAA000<-rbind(AAA000,c(AAA003,AAA005,result))
    }
    rm(list=ls()[-c(1:6)])
}
a1<-na.omit(AAA000)
a2<-data.frame(matrix(NA,nrow(a1),ncol(a1)))
a2[,1:2]<-a1[,1:2]
a2[,3:4]<-as.numeric(a1[,3:4])
1 голос
/ 14 марта 2012

Это лучшее, что я могу сделать сегодня вечером.Я использовал другой набор пакетов.

pn<-c("ggplot2","plyr","reshape")
for(j in 1:length(pn)){
    a1<-length(data(package=pn[j])$results[,3])
    for(i in 1:a1){
    cat( data(package=pn[j])$results[i,3] , package=as.character(pn[j]), "\n" )
    }
}

Вывод, который я получил, находится здесь.

diamonds ggplot2 
economics ggplot2 
midwest ggplot2 
movies ggplot2 
mpg ggplot2 
msleep ggplot2 
presidential ggplot2 
seals ggplot2 
baseball plyr 
ozone plyr 
french_fries reshape 
smiths reshape 
tips reshape 

РЕДАКТИРОВАТЬ

Я считаю, что причина dim вернулась NULL в вашем коде, потому что наборы данных не были фактически доступны, потому что библиотеки не были открыты.Я считаю, что ваш и мой код просто читают текстовый файл, содержащий имена наборов данных, которые находятся в библиотеке.

Вы можете загрузить несколько библиотек, используя:

lapply(pn, require, character.only=T)

ОднакоЯ еще не выяснил, как рекурсивно обращаться к наборам данных после загрузки библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...