假设 R 中的以下变量:
test <- c(1,5,4,3,2,3,5,4,2,1,5,1,2,3,4, NA, NA, NA)
要获得频率表,有几种计算方法
在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之间的一些值来获得不同的频率。似乎我不自觉地为每个值获得相同的频率。 -.-
答案 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)
结果:
答案 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 )
}