Crosstable类似于R中的Stata

时间:2015-03-31 15:00:12

标签: r crosstab reshape2

我正在使用加州大学洛杉矶分校sample data set

> read <- read.table("http://www.ats.ucla.edu/stat/mult_pkg/faq/general/sample.csv",
          header=TRUE, sep=",", quote="\"")
> head(read)
  female read write math hon femalexmath
1      0   57    52   41   0           0
2      1   68    59   53   0          53
3      0   44    33   54   0           0
4      0   63    44   47   0           0

我想crosstab变量honfemale

所需结果看起来像stata输出:

           |        female
       hon |      male     female |     Total
-----------+----------------------+----------
         0 |        74         77 |       151 
         1 |        17         32 |        49 
-----------+----------------------+----------
     Total |        91        109 |       200 

使用R,我尝试使用xtabs

> xtabs(female~hon, data = read)
hon
 0  1 
77 32 

reshape2

> library(reshape2)
> melt <- melt(read, id="female")
> dcast(melt, variable ~ female, sum, subset = .(variable == "hon"))
hon
 0  1 
77 32 

table

> table(read$hon, read$female)
     0  1
  0 74 77
  1 17 32

但这只是所需结果的一部分

我想要包含non-female(= male)值并计算总数,并适当地指定名称。

我在R中错过了一个简单的功能吗?

我看过这篇文章Mimic tabulate command from Stata in R,但由于此问题中的代码未包含gmodels的库CrossTable,因此我无法应用它。输出看起来也不同。

1 个答案:

答案 0 :(得分:1)

library(gmodels)
read$gender <- ifelse(read$female==1, "Female", "Male")
with(read, CrossTable(hon, gender, prop.c=FALSE, prop.r = FALSE, prop.t = FALSE, prop.chisq = FALSE))

返回:

   Cell Contents
|-------------------------|
|                       N |
|-------------------------|


Total Observations in Table:  200 


             | gender 
         hon |    Female |      Male | Row Total | 
-------------|-----------|-----------|-----------|
           0 |        77 |        74 |       151 | 
-------------|-----------|-----------|-----------|
           1 |        32 |        17 |        49 | 
-------------|-----------|-----------|-----------|
Column Total |       109 |        91 |       200 | 
-------------|-----------|-----------|-----------|

指定所有这些参数是单调乏味的,所以如果你发现自己经常使用CrossTable()函数,你可以写一个包装函数:

tab <- function(x, y) {
  argx <- deparse(substitute(x))
  argy <- deparse(substitute(y))
  return(CrossTable(x, y, prop.c=FALSE, prop.r = FALSE, prop.t = FALSE, prop.chisq = FALSE, dnn = c(argx, argy)))
}

这样称呼:

with(read, tab(hon, gender))