从R中的选定包中自动索引数据集列表

时间:2012-03-14 06:14:17

标签: r

我正在尝试从选择的包中索引所有数据集。以下代码,错误,但我不明白为什么:

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")))
    }
}

修改

我想要它,主要是加载数据集,依次说,检查它的大小(例如,对木材,强碱)

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

会从robustbase加载“wood”,但是对于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 个答案:

答案 0 :(得分:2)

使用与Mark相同的一套包

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)):

  

如果答案是解析(),你通常应该重新考虑这个问题。          - 托马斯拉姆利            R-help(2005年2月)

此循环的结果是:

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 :(得分:1)

这是我今晚能做的最好的事情。我使用了一套不同的包。

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)

但是,我还没有想出如何在加载库之后递归访问数据集。

答案 2 :(得分:1)

使用此代码我获得了更好的结果:Mark Miller发布的代码运行良好 在我们用于说明的三个例子中,但不知何故无法列出所有数据集......

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])