如何将交叉表导出到 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.output
将 print.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"
我有一个数据集,其中 运行 这段代码:
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.output
将 print.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"