我正在使用加州大学洛杉矶分校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
变量hon
和female
所需结果看起来像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
,因此我无法应用它。输出看起来也不同。
答案 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))