gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:29:16 25 4
gpt4 key购买 nike

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

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

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
}

我已经能够通过绑定(bind)此 PrettyTable 的输出(部分)来做到这一点:

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

此方法中的一些问题:请注意第一个 PrettyTable 中的 1:11 部分:此代码无法识别两个数据集中出现的不同数量的级别。不幸的是,我不够熟练,无法确定需要添加/调整哪些代码才能在无需手动编辑的情况下获得所需的结果。

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

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

非常感谢您的帮助,我在试图解决这个问题时一直摸不着头脑,但我自己无法做到这一点。

最佳答案

以下是一些方法:

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)|
+--------+-------+-------+

table

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 解决方案。

关于r - 一张表中两个数据集的分类汇总统计(比较),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com