Crosstable похож на Stata в R

Я работаю с набором данных UCLA

> 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?

Я видел этот пост Имитация команды tabulate из Stata в R, но поскольку код в этом вопросе не содержал библиотеки gmodels для CrossTable, я не мог ее применить. Вывод тоже выглядит иначе.


person rmuc8    schedule 31.03.2015    source источник
comment
возможный дубликат команды Mimic tabulate из Stata в R   -  person Sam Firke    schedule 31.03.2015
comment
Я видел этот пост, но он отличается от вывода статистики, о котором я упоминал в своем посте.   -  person rmuc8    schedule 31.03.2015
comment
Дополнение к комментарию Дэвида: addmargins(table(read$hon, read$female, dnn = c("Hon", "Female")))   -  person r.bot    schedule 31.03.2015
comment
спасибо @DavidArenburg, это то, что я искал. Я внес правку в связанный пост, который относится к пакету gmodels. мой пост кажется дубликатом тогда   -  person rmuc8    schedule 31.03.2015


Ответы (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))
person Sam Firke    schedule 31.03.2015