在R中复制“自定义表”比较

时间:2010-07-29 14:28:21

标签: r spss

我每天都在使用SPSS,但实际上一直在努力学习R.让我筋疲力尽的主要因素是我需要为我所做的市场调查轻松生成表格,横幅和交叉标签。我喜欢SPSS中的Custom Tables选项,我正在寻找有关如何使用R。

复制它的建议

我相信R比SPSS有很多优势,其中之一就是能够与LaTeX集成以获得可重复的报告。 SPSS非常适合快速探索(点击和点击),但是在获取结果并将其打包到客户可接受的可交付物等时仍有很多需要。那就是说,R是如此强大,我觉得我可以做任何事我如果我只能按照我需要的方式做横幅/交叉按钮,那就需要它。

简而言之,我可以选择生成类似于以下内容的报告表吗?我正在复制SPSS语法命令和输出以供参考。

CTABLES 
  /VLABELS VARIABLES=age educ paeduc maeduc speduc prestg80 happy 
    DISPLAY=DEFAULT 
  /TABLE age [MEAN F40.3, VALIDN COMMA40.0] + educ [MEAN F40.3, VALIDN COMMA40.0] + paeduc [MEAN F40.3, VALIDN COMMA40.0] + maeduc [MEAN F40.3, VALIDN COMMA40.0] + speduc [MEAN F40.3, VALIDN COMMA40.0] + prestg80 [MEAN F40.3, VALIDN COMMA40.0] BY happy 
  /SLABELS POSITION=ROW 
  /CATEGORIES VARIABLES=happy ORDER=A KEY=VALUE EMPTY=INCLUDE TOTAL=YES POSITION=AFTER MISSING=EXCLUDE 
  /SIGTEST TYPE=CHISQUARE ALPHA=0.05 INCLUDEMRSETS=YES CATEGORIES=ALLVISIBLE 
  /COMPARETEST TYPE=MEAN ALPHA=0.05 ADJUST=BONFERRONI ORIGIN=COLUMN INCLUDEMRSETS=YES CATEGORIES=ALLVISIBLE MEANSVARIANCE=ALLCATS MERGE=NO 
  /COMPARETEST TYPE=PROP ALPHA=0.05 ADJUST=BONFERRONI ORIGIN=COLUMN INCLUDEMRSETS=YES CATEGORIES=ALLVISIBLE MERGE=NO.

我附上了输出结果的图片。我特别感兴趣的是能够在行/列中包含多个变量,并且如果需要,可以灵活地嵌套它们。在图像中,我有一些连续变量由列中的分类变量剪切,汇总统计信息放在行中。顺便说一句,我也非常喜欢快速列均值比较的功能 - 但是数字可以快速访问R中的条件交叉生成。

6 个答案:

答案 0 :(得分:2)

尝试从"tables"包中探索“表格”功能。我认为这可能会有所帮助。

答案 1 :(得分:1)

这在R中目前并不容易。您可能需要将多个包中的多个函数串起来以获得这样的输出。

答案 2 :(得分:1)

我刚刚下载了包的psych,它非常适合为按变量细分的摘要统计数据生成表。它的格式不像stata那么好。我想你可以将它输出到一个文本文件中,然后按照你想要的方式格式化。

答案 3 :(得分:1)

在useR 2010上有几个关于此主题的演示文稿,因此您可能会很快看到更多的软件包试图解决此问题。

答案 4 :(得分:0)

请参阅xtable包以获取导出到LaTeX和HTML的表格。不过可能还有其他套餐。 This看起来很有希望。你听说过Sweave吗?

答案 5 :(得分:0)

我也很多次遇到R用户友好的输出问题...我找到的唯一解决方案是编写自己的功能,我很乐意在这里与您分享:

以下函数为data.frame中的所有因子变量返回因子变量"变量"的每个级别的频率或百分比(calc =" perc")。
最重要的是输出是一个简单的用户友好data.frame。因此,以任何您想要的方式导出结果都没有问题。

我意识到进一步改进的可能性很大,即增加了选择行与列百分比计算等的可能性。它是一个正在进行中的状态,但可以完成工作。

contitable <- function( survey_data, variable, calc="freq" ){    

  # Check which variables are not given as factor    
  # and exlude them from the given data.frame    
 survey_data_factor_test <- as.logical( sapply( Survey, FUN=is.factor) )    
  survey_data <- subset( survey_data, select=which( survey_data_factor_test ) )    

  # Inform the user about deleted variables    
  # is that proper use of printing to console during a function call??    
  # for now it worksjust fine...    
  flush.console()        
  writeLines( paste( "\n ", sum( !survey_data_factor_test, na.rm=TRUE),
            "non-factor variable(s) were excluded\n" ) )

  variable_levels <- levels(survey_data[ , variable ])    
  variable_levels_length <- length( variable_levels )    

  # Initializing the data.frame which will gather the results    
  result <- data.frame( "Variable", "Levels", t(rep( 1, each=variable_levels_length ) ) )    
  result_column_names <- paste( variable, variable_levels, sep="." )    
  names(result) <- c("Variable", "Levels", result_column_names )    

  for(column in 1:length( names(survey_data) ) ){       

      column_levels_length <- length( levels( survey_data[ , column ] ) )
      result_block <- as.data.frame( rep( names(survey_data)[column], each=column_levels_length ) )
      result_block <- cbind( result_block, as.data.frame( levels( survey_data[,column] ) ) )
      names(result_block) <- c( "Variable", "Levels" )

      results <- table( survey_data[ , column ], survey_data[ , variable ] )

      if( calc=="perc" ){ 
        results <- apply( results, MARGIN=2, FUN=function(x){ x/sum(x) }) 
        results <- round( results*100, 1 )
      }

      results <- unclass(results)
      results <- as.data.frame( results )
      names( results ) <- result_column_names
      rownames(results) <- NULL

      result_block <- cbind( result_block, results) 
      result <- rbind( result, result_block ) 
}    
result <- result[-1,]        
return( result )    
}