一个表中两个数据集的分类汇总统计(比较)

时间:2014-03-30 13:13:49

标签: r

我遇到了制作一个表格的问题,该表格总结了我的两个数据集及其分类变量,这是一个我在各种论文中经常看到的格式的表格。

问题如下,我有两个数据集(一个比另一个过滤得多一点),我想并排显示他们的分类汇总统计数据。 使用两个数据集:

A <- head(mtcars[, c(2, 8:11)])

                  cyl vs am gear carb
Mazda RX4           6  0  1    4    4
Mazda RX4 Wag       6  0  1    4    4
Datsun 710          4  1  1    4    1
Hornet 4 Drive      6  1  0    3    1
Hornet Sportabout   8  0  0    3    2
Valiant             6  1  0    3    1

B <- head(mtcars[3:6, c(2, 8:11)])
                  cyl vs am gear carb
Datsun 710          4  1  1    4    1
Hornet 4 Drive      6  1  0    3    1
Hornet Sportabout   8  0  0    3    2
Valiant             6  1  0    3    1

我想像这样提供摘要统计数据:

                           Table A                  Table B
  Variable Levels Count Column N %  Levels Count Column N %
1       cyl      4     1      16.67      4     1         25
2                6     4      66.67      6     2         50
3                8     1      16.67      8     1         25
4        vs      0     3         50      0     1         25
5                1     3         50      1     3         75
6        am      0     3         50      0     3         75
7                1     3         50      1     1         25
8      gear      3     3         50      3     3         75
9                4     3         50      4     1         25
10     carb      1     3         50      1     3         75
11               2     1      16.67      2     1         25
12               4     2      33.33      4     0          0

我已经能够在汽车数据集上使用this post中描述的prettyTable.R来接近我想要的东西,但是我很难根据我的需要调整这个片段:

Roman Luštrik:
Here's my solution. It ain't pretty, which is why I put a bag over its head (wrap it in     a function). I also add another variable to demonstrate that it's general (I hope).

prettyTable <- function(x) {

  tbl <- apply(x, 2, function(m) {
    marc <- sort(unique(m))
    cnt <- matrix(table(m), ncol = 1)
    out <- cbind(marc, cnt)
    out <- out[order(marc), ] # do sorting
    out <- cbind(out, round(prop.table(out, 2)[, 2] * 100, 2))
  })

  x2 <- do.call("rbind", tbl)

  spaces <- unlist(lapply(apply(x, 2, unique), length))
  space.names <- names(spaces)
  spc <- rep("", sum(spaces))
  ind <- cumsum(spaces)
  ind <- abs(spaces - ind)+1
  spc[ind] <- space.names

  out <- cbind(spc, x2)
  out <- as.data.frame(out)

  names(out) <- c("Variable", "Levels", "Count", "Column N %")
  out
}

我已经能够(部分地)通过cbinding这个prettyTable的输出来实现:

cbind(prettyTable(A)[1:11,],prettyTable(B))

这种方法中的一些问题:注意第一个prettyTable中的1:11部分:此代码无法识别两个数据集中出现的不同数量的级别。遗憾的是,我没有足够的技能来识别需要添加/调整的代码,以便在没有手动编辑的情况下获得所需的结果。

此外,如果它们是因素,那么prettyTable.R片段不接受我的分类变量,这给我提供了一个错误(我认为)是指代码中的prop.table函数。要复制该情况,请在制作prettyTable之前添加以下代码。

A$cyl <- as.factor(A$cyl)
B$cyl <- as.factor(B$cyl)
prettyTable(A)
Error in FUN(newX[, i], ...) : invalid 'type' (character) of argument

最后,该功能在汇总时不接受一列数据。这不一定适用于我的情况,但我猜这样的片段对于其他人也有用,如果它也有这个功能。

prettyTable(A$cyl)
Error in apply(x, 2, function(m) { : dim(X) must have a positive length

非常感谢您的帮助,我在试图弄清楚这一点的时候一直在摸不着头脑,但我自己也无法这样做。

1 个答案:

答案 0 :(得分:5)

以下是一些方法:

Hmisc 有关详细信息,请参阅?summary.formula

library(Hmisc)
AB <- rbind(cbind(A, Table = "A"), cbind(B, Table = "B"))
s <- summary(Table ~., data = AB, method = "reverse")
print(s, exclude1 = FALSE)

,并提供:

Descriptive Statistics by Table

+--------+-------+-------+
|        |A      |B      |
|        |(N=6)  |(N=4)  |
+--------+-------+-------+
|cyl : 4 |17% (1)|25% (1)|
+--------+-------+-------+
|    6   |67% (4)|50% (2)|
+--------+-------+-------+
|    8   |17% (1)|25% (1)|
+--------+-------+-------+
|vs : 0  |50% (3)|25% (1)|
+--------+-------+-------+
|    1   |50% (3)|75% (3)|
+--------+-------+-------+
|am : 0  |50% (3)|75% (3)|
+--------+-------+-------+
|    1   |50% (3)|25% (1)|
+--------+-------+-------+
|gear : 3|50% (3)|75% (3)|
+--------+-------+-------+
|    4   |50% (3)|25% (1)|
+--------+-------+-------+
|carb : 1|50% (3)|75% (3)|
+--------+-------+-------+
|    2   |17% (1)|25% (1)|
+--------+-------+-------+
|    4   |33% (2)| 0% (0)|
+--------+-------+-------+

<强> tableone

library(tableone)
AB.fac <- replace(AB, TRUE, lapply(AB, factor)) # AB is from above
tableOne <- CreateCatTable(vars = names(AB)[-6], strata = "Table", data = AB.fac)
print(tableOne, showAllLevels = TRUE, test = FALSE)

,并提供:

          Stratified by Table
           level A         B        
  n              6         4        
  cyl (%)  4     1 (16.7)  1 (25.0) 
           6     4 (66.7)  2 (50.0) 
           8     1 (16.7)  1 (25.0) 
  vs (%)   0     3 (50.0)  1 (25.0) 
           1     3 (50.0)  3 (75.0) 
  am (%)   0     3 (50.0)  3 (75.0) 
           1     3 (50.0)  1 (25.0) 
  gear (%) 3     3 (50.0)  3 (75.0) 
           4     3 (50.0)  1 (25.0) 
  carb (%) 1     3 (50.0)  3 (75.0) 
           2     1 (16.7)  1 (25.0) 
           4     2 (33.3)  0 ( 0.0) 

已修订已添加tableone解决方案。