Maybe something is missing for me. The default settings for CrossTable seem to provide substantially what you are looking for.
Here's a CrossTable with minimal arguments. (I uploaded the dataset as "temp".) Note that the results are the same as you posted on Stata's output (you just need to multiply by 100 if you want to get the result as a percentage).
library(gmodels) with(temp, CrossTable(cursmoke1, cursmoke2, missing.include=TRUE)) Cell Contents |-------------------------| | N | | Chi-square contribution | | N / Row Total | | N / Col Total | | N / Table Total | |-------------------------| Total Observations in Table: 4434 | cursmoke2 cursmoke1 | No | Yes | NA | Row Total | -------------|-----------|-----------|-----------|-----------| No | 1898 | 131 | 224 | 2253 | | 541.582 | 635.078 | 4.022 | | | 0.842 | 0.058 | 0.099 | 0.508 | | 0.862 | 0.076 | 0.444 | | | 0.428 | 0.030 | 0.051 | | -------------|-----------|-----------|-----------|-----------| Yes | 305 | 1596 | 280 | 2181 | | 559.461 | 656.043 | 4.154 | | | 0.140 | 0.732 | 0.128 | 0.492 | | 0.138 | 0.924 | 0.556 | | | 0.069 | 0.360 | 0.063 | | -------------|-----------|-----------|-----------|-----------| Column Total | 2203 | 1727 | 504 | 4434 | | 0.497 | 0.389 | 0.114 | | -------------|-----------|-----------|-----------|-----------|
Alternatively, you can use format="SPSS" if you want the numbers displayed as a percentage.
with(temp, CrossTable(cursmoke1, cursmoke2, missing.include=TRUE, format="SPSS")) Cell Contents |-------------------------| | Count | | Chi-square contribution | | Row Percent | | Column Percent | | Total Percent | |-------------------------| Total Observations in Table: 4434 | cursmoke2 cursmoke1 | No | Yes | NA | Row Total | -------------|-----------|-----------|-----------|-----------| No | 1898 | 131 | 224 | 2253 | | 541.582 | 635.078 | 4.022 | | | 84.243% | 5.814% | 9.942% | 50.812% | | 86.155% | 7.585% | 44.444% | | | 42.806% | 2.954% | 5.052% | | -------------|-----------|-----------|-----------|-----------| Yes | 305 | 1596 | 280 | 2181 | | 559.461 | 656.043 | 4.154 | | | 13.984% | 73.177% | 12.838% | 49.188% | | 13.845% | 92.415% | 55.556% | | | 6.879% | 35.995% | 6.315% | | -------------|-----------|-----------|-----------|-----------| Column Total | 2203 | 1727 | 504 | 4434 | | 49.684% | 38.949% | 11.367% | | -------------|-----------|-----------|-----------|-----------|
Update: prop.table()
Just FYI (to save the tedious job you did when creating your own data.frame , just like you), you might also be interested in the prop.table() function.
Again, using the data you contacted and think it's called "temp", the basic data below is what you can build your data.frame . You may also be interested in viewing the functions margin.table() or addmargins() :
#
source share