如何在R中获得详细的表格列表?

时间:2012-03-06 23:56:56

标签: r statistics sas

使用SAS已经6年并且正在迁移到R.我曾经使用proc内容来获得对表,特征和数据类型的健康描述。

使用str(tableName)我可以看到数据框中的类型而不是矢量位置。

使用name(tableName)我可以看到矢量的名称和位置,但不能看到类型。

使用summary(tableName)我可以看到分位数/类别,但不能看到容易的类型或向量位置。

有没有办法可以获得一份清单 名称vectorPosition类型min max avg med [..]

4 个答案:

答案 0 :(得分:8)

听起来您可能正在寻找describe()包中Hmisc之类的内容。我的回忆是,Frank Harrel(该软件包的作者)是一位长期的SAS程序员,很早就来到了R世界。 describe()提供的摘要风格当然似乎反映了计算谱系:

library(Hmisc)
describe(cars) # for example
cars 

 2  Variables      50  Observations
---------------------------------------------------------------------------------
speed 
      n missing  unique    Mean     .05     .10     .25     .50     .75     .90 
     50       0      19    15.4     7.0     8.9    12.0    15.0    19.0    23.1 
    .95 
   24.0 

          4 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25
Frequency 2 2 1 1  3  2  4  4  4  3  2  3  4  3  5  1  1  4  1
%         4 4 2 2  6  4  8  8  8  6  4  6  8  6 10  2  2  8  2
---------------------------------------------------------------------------------
dist 
      n missing  unique    Mean     .05     .10     .25     .50     .75     .90 
     50       0      35   42.98   10.00   15.80   26.00   36.00   56.00   80.40 
    .95 
  88.85 

lowest :   2   4  10  14  16, highest:  84  85  92  93 120 
---------------------------------------------------------------------------------

答案 1 :(得分:7)

您可以使用lapply来调用某个功能 在data.frame的每一列上, 并计算该函数中所需的所有数量。

summary_text <- function(d) {
  do.call(rbind, lapply( d, function(u)
    data.frame(
      Type    = class(u)[1],
      Min     = if(is.numeric(u)) min(   u, na.rm=TRUE) else NA,
      Mean    = if(is.numeric(u)) mean(  u, na.rm=TRUE) else NA,
      Median  = if(is.numeric(u)) median(u, na.rm=TRUE) else NA,
      Max     = if(is.numeric(u)) max(   u, na.rm=TRUE) else NA,
      Missing = sum(is.na(u))
    )    
  ) )
}
summary_text(iris)

但我个人更喜欢以图形方式查看数据: 以下函数将绘制直方图和分位数 - 分位数图 对于每个数字变量,以及每个因子的条形图, 在一个页面上。如果你有20到30个变量,它应该仍然可用。

summary_plot <- function(d, aspect=1) {
  # Split the screen: find the optimal number of columns 
  # and rows to be as close as possible from the desired aspect ratio.
  n <- ncol(d)
  dx <- par()$din[1]
  dy <- par()$din[2]
  f <- function(u,v) {
    if( u*v >= n && (u-1)*v < n && u*(v-1) < n ) {
      abs(log((dx/u)/(dy/v)) - log(aspect))
    } else { 
      NA 
    }
  }
  f <- Vectorize(f)
  r <- outer( 1:n, 1:n, f )
  r <- which( r == min(r,na.rm=TRUE), arr.ind=TRUE )
  r <- r[1,2:1]

  op <- par(mfrow=c(1,1),mar=c(2,2,2,2))
  plot.new()
  if( is.null( names(d) ) ) { names(d) <- 1:ncol(d) }
  ij <- matrix(seq_len(prod(r)), nr=r[1], nc=r[2], byrow=TRUE)
  for(k in seq_len(ncol(d))) {
    i <- which(ij==k, arr.ind=TRUE)[1]
    j <- which(ij==k, arr.ind=TRUE)[2]
    i <- r[1] - i + 1
    f <- c(j-1,j,i-1,i) / c(r[2], r[2], r[1], r[1] )
    par(fig=f, new=TRUE)
    if(is.numeric(d[,k])) { 
      hist(d[,k], las=1, col="grey", main=names(d)[k], xlab="", ylab="")
      o <- par(fig=c(
          f[1]*.4  + f[2]*.6,
          f[1]*.15 + f[2]*.85,
          f[3]*.4  + f[4]*.6,
          f[3]*.15 + f[4]*.85
        ), 
        new=TRUE,
        mar=c(0,0,0,0)
      )
      qqnorm(d[,k],axes=FALSE,xlab="",ylab="",main="")
      qqline(d[,k])
      box()
      par(o)
    } else {
      o <- par(mar=c(2,5,2,2))
      barplot(table(d[,k]), horiz=TRUE, las=1, main=names(d)[k])
      par(o)
    }
  }
  par(op)
}
summary_plot(iris)

答案 2 :(得分:2)

这真的是“快速'肮脏的”,但如果我理解正确的话,这就是你所追求的。

例如,我获取了summary()返回的信息,只是为每个数据框列添加了有关classmode的信息。我对R中的table类并不熟悉,因此格式化确实不合适。

df <- data.frame(
    a=1:5,
    b=rep(TRUE, 5),
    c=letters[1:5]
)

mySummary <- function(x, ...) {
    out <- NULL
    for (ii in 1:ncol(x)) {
        temp <- list(
            c(paste("Class:", class(x[,ii])), paste("Mode:", mode(x[,ii])),
            c(a[,ii]))
        )
        names(temp) <- names(x)[ii]
        out <- c(out, temp)
    }   
    out 
}

> mySummary(df)
$a

"Class: integer"  "Mode: numeric"    "Min.   :1  "    "1st Qu.:2  " 

   "Median :3  "    "Mean   :3  "    "3rd Qu.:4  "    "Max.   :5  " 

$b

"Class: logical"  "Mode: logical" "Mode:logical  " "TRUE:5        " 

"NA's:0        "               NA               NA               NA 

$c

"Class: factor" "Mode: numeric"         "a:1  "         "b:1  "         "c:1  " 

        "d:1  "         "e:1  "              NA 

您可能想要了解如何定义类summary()的{​​{1}}方法,然后继续进行调整以满足您的需求。

找出为data.frame

定义的方法
summary()

这是一种获取代码的方法

methods("summary")

> methods("summary")
 [1] summary.aov             summary.aovlist         summary.aspell*        
 [4] summary.connection      summary.data.frame      summary.Date           
 [7] summary.default         summary.ecdf*           summary.factor         
[10] summary.glm             summary.infl            summary.lm             
[13] summary.loess*          summary.manova          summary.matrix         
[16] summary.mlm             summary.nls*            summary.packageStatus* 
[19] summary.PDF_Dictionary* summary.PDF_Stream*     summary.POSIXct        
[22] summary.POSIXlt         summary.ppr*            summary.prcomp*        
[25] summary.princomp*       summary.srcfile         summary.srcref         
[28] summary.stepfun         summary.stl*            summary.table          
[31] summary.tukeysmooth*   

   Non-visible functions are asterisked

答案 3 :(得分:0)

我怀疑你只是想要:

lapply(tableName, class)

您可能想想

lapply(tableName, typeof)

...但typeof仅返回信息量较少的存储模式,因为R中的函数将在变量的“类”上调度。