如何将交叉表导出到 csv

How to export crosstab to csv

我有一个数据集,其中 运行 这段代码:

source("http://pcwww.liv.ac.uk/~william/R/crosstab.r")
crosstab(nautos, row.vars = "s2_nautos_voor", col.vars = "s2_nautos_nu", type = "t")

得到这个结果:

               s2_nautos_nu      0      1     2+    Sum
s2_nautos_voor                                         
0                            19.89   3.31   0.05  23.25
1                             0.92  51.71   1.78  54.41
2+                            0.31   2.45  19.58  22.34
Sum                          21.11  57.47  21.42 100.00

但是,当我尝试使用此代码将其保存在 csv 中时:

crosstabs_nautos <- crosstab(nautos, row.vars = "s2_nautos_voor", col.vars = "s2_nautos_nu", type = "t")
write.csv(crosstabs_nautos$table,"crosstabs_nautos.csv")

它以类型 = f 而不是 t 保存。换句话说,它不保存函数,我得到这个:

               s2_nautos_nu    0    1   2+  Sum
s2_nautos_voor                                 
0                            390   65    1  456
1                             18 1014   35 1067
2+                             6   48  384  438
Sum                          414 1127  420 1961 

...无论我应用哪个交叉表函数。

我该如何解决这个问题?

我猜测 crosstabs 函数仅将 table 作为频率存储在 class 交叉表的对象中,然后使用所需类型“打印”到控制台关联的 S3 print.crosstabs 函数在“决定”是否打印原始频率或百分比之前检查类型。如果只将列表结构的“table”叶子发送到write.csv,那么就没有机会检查类型。也许您需要通过实验或阅读代码来解决这个问题。我在该学术网站上找不到该组功能的任何文档。如果您有任何文档链接,那么您应该将它们包含在您的问题中。

此外,代码中的大部分检查都是这样的:

if ( type="frequency") {   do something

所以它们被写成精确检查,拼写需要准确而不是缩写。您可以使用 capture.outputprint.crosstabs 的结果发送到文件。它不会以 csv 分隔。但是,这可能不是问题,因为您关心的输出中似乎没有逗号。尝试

 capture.output( print(crosstabs_nautos, type = "frequencies") , 
               file="crosstabs_nautos.txt")

或者您可以 write.csv 使用对象 crosstab_nautos$table/1961

编辑:在交叉表函数末尾附近有一些代码让我觉得我的猜测并不完全正确:

 #(b) tabular output [3 variants]
    result$table <- tbl  #Stores original cross-tab frequency counts without margins [class: table]
    result$crosstab <- crosstab #Stores cross-tab in table format using requested style(frequency/pct) and table margins (on/off)
                                #[class: table]  
    result$crosstab.nosub <- t1  #crosstab with subtotals suppressed [class: dataframe; or NULL if no subtotals suppressed]  
    class(result) <- "crosstab"