表输出如SPSS加上导出到MS Word

时间:2013-11-22 09:48:52

标签: r spss

假设 R 中的以下变量:

test <- c(1,5,4,3,2,3,5,4,2,1,5,1,2,3,4, NA, NA, NA)

要获得频率表,有几种计算方法

  • “原始”频率,这意味着频率,也包括NA
  • “原始”百分比,与上述相同,仅为百分比
  • “有效”频率,仅限那些没有NAs的频率
  • “有效”百分比,与上述相同,只是百分比

在SPSS中,您可以使用频率函数轻松获得此输出。

然而,在 R 中,这是屁股中的痛苦。至于现在,我没有设法获得具有上述值的表,而没有花费“小时”来构建此表输出。

当然, R 具有计算值所需的所有功能,但很难将它们全部放在一个输出中,特别是如果你有NA,因为对于“原始”值你需要一行NAs,对于你没有的“有效”值,但如果你把这些值放在一个矩阵或其他东西中, R 会抱怨原始和有效分数的行不平等。

简而言之:是否有可能在 R 中构建类似SPSS的频率表?

我的第二个问题是,如何将表导出到MS Word。

R 中的问题是,表格使用空格来分隔值。如果将其复制/粘贴到MS Word中,则无法构建正确的表格。

我知道有一些包,例如R2wd(我甚至根本没有工作)或rtf(这对我来说很合适),但也许你现在还有其他一些可能性。

编辑:

上述示例的输出表应如下所示:

Values    raw frequencies    raw percentage    valid freq.   valid percentage
1         3                  16,67             3             20,00
2         3                  16,67             3             20,00
3         3                  16,67             3             20,00
4         3                  16,67             3             20,00
5         3                  16,67             3             20,00
NA        3                  16,67             /             /

我必须为这个例子道歉。我只是随机输入1到5之间的一些值来获得不同的频率。似乎我不自觉地为每个值获得相同的频率。 -.-

4 个答案:

答案 0 :(得分:2)

我正在开发一个软件包,除其他外,它允许各种(描述性)统计信息的简单表输出。查看示例in this blog post或查看package at CRAN

代码示例:

require(sjPlot) # load package
# load sample data
data(efc)
# simple frequency table
sjt.frq(efc$e42dep)

结果:

table output in RStudio viewer pane

答案 1 :(得分:1)

您可以使用包R2HTML简单地获得类似SPSS的输出。在同样的情况下,这对我非常有用。

答案 2 :(得分:1)

尽管我不确切知道所需的SPSS表应该是什么样子,但这是我对你可能想要做的最好的猜测。

freqTable <- function(df, freq.digits=4, perc.digits=2){
  q1 <- table(df, useNA="always")                  # "raw" table
  q2 <- q1/sum(q1)                                 # frequencies
  q3 <- c(table(df, useNA="no"), 'NA'=NA)          # "valid" table; with NA 
  q4 <- q3/sum(q3, na.rm=TRUE)                     # frequencies
  rbind(raq.freq=round(q2, freq.digits), 
        raw.perc=round(q2*100, perc.digits), 
        val.freq=round(q4, freq.digits), 
        val.perc=round(q4*100, perc.digits))
}
freqTable(test)

#                 1       2       3       4       5    <NA>
#  raq.freq  0.1667  0.1667  0.1667  0.1667  0.1667  0.1667
#  raw.perc 16.6700 16.6700 16.6700 16.6700 16.6700 16.6700
#  val.freq  0.2000  0.2000  0.2000  0.2000  0.2000      NA
#  val.perc 20.0000 20.0000 20.0000 20.0000 20.0000      NA

对于第二个问题,我建议使用knitr来创建动态文档。如果它是一次性的东西,我发现最简单的方法是保存一个csv文件并从那里导入到word。

write.csv2(freqTable(test), "test_table.csv")

答案 3 :(得分:0)

不幸的是,似乎没有R包可以产生像SPSS这样的好输出。用于生成表的大多数函数似乎都定义了自己的特殊格式,类等。如果您想以其他方式导出或处理它,会让您遇到麻烦。
但根据我的经验,R可以产生这样的输出。但是到目前为止似乎没有人能够使用它,所以我开始编写自己的函数。我很高兴与您分享结果(工作进展状态,但完成工作):

以下函数为data.frame中的所有因子变量返回因子变量&#34;变量&#34;的每个级别的频率或百分比(calc =&#34; perc&#34;)。
最重要的是输出是简单的&amp;用户友好的data.frame。因此,与许多其他功能相比,以任何您想要的方式导出结果都没有问题。
一个例子:用函数&#34; View&#34;查看结果data.frame;然后只需将其复制并粘贴到Excel,Word等

我意识到进一步改进的可能性很大,即增加了选择行与列百分比计算等的可能性,但现在这应该会有所帮助。

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