【问题标题】:Create a table with counts and percentages with missing data创建一个包含缺少数据的计数和百分比的表
【发布时间】:2019-07-15 14:07:29
【问题描述】:

我正在尝试创建一个具有预设尺寸的表格,并让 R 填充计数和百分比。这是针对 R-markdown 报告的。

这是我的示例数据的代码。

#This is the most realistic data I could produce.
Maj <- rep("Major A", times=50)
set.seed(24601) 
Race <- sample(c("Asian","Black", "Am Indian","Hawiian" ,"Hispanic","White","Two or More Races","Not Reported"),
                 prob=c(.01,.1,.01,.01,.02,.80,.05,.01),size=50, replace = T)
Sex <- sample(c("Female","Male"), prob=c(.98,.02),size=50,replace=T)

Enroll_MajorA <- cbind(Maj,Sex,Race)

我需要该表来计算数据集中是否存在给定的种族和性别组合的计数和百分比。这是我需要的样子。

我尝试单独计算表的每个值,R-markdown 给了我一个“内存错误”。我已经尝试创建一个计数和百分比表并将它们组合在一起,但它并没有提供报告所需的所有种族/性别组合。我不知道从这里去哪里。请帮忙!

【问题讨论】:

  • 如果您想通过table获得所有级别/级别组合,它们需要成为因素
  • 百分比指的是什么?来自某个种族的所有女性的百分比,或特定种族中女性的比例?
  • Enroll_MajorA &lt;- data.frame(Maj, Sex=factor(Sex, levels=c("Female", "Male")), Race=factor(Race, levels=c("Asian","Black", "Am Indian","Hawiian" ,"Hispanic","White","Two or More Races","Not Reported"))); with(Enroll_MajorA, table(Sex, Race))
  • 分号是用来分隔两个语句的,但是可以,你可以用换行符替换它
  • with prop.table: prop.table(table(...))

标签: r datatable count percentage kableextra


【解决方案1】:

您可以使用aggregate。您可以保持矩阵不变,因为您可以使用as.data.frame,它会自动强制转换为可数因子。 NROW(大写)不区分矩阵和向量。

m.agg <- do.call(data.frame, 
                 aggregate(. ~ Sex + Race, as.data.frame(Enroll_MajorA), function(x) 
                   c(count=as.integer(NROW(x)), share=NROW(x) / NROW(Enroll_MajorA))))

为了获得完整的集合,我们可能会与 expand.grid 合并,我们可能需要稍微清理一下。

res <- merge(as.data.frame(m.agg), expand.grid(Sex=c("Female", "Male"), 
                                               Race=relevant.races), all=TRUE)  # `relevant.races` below
res[, 3:4][is.na(res[, 3:4])] <- 0  # transform `NA` into 0 to be nice
res[order(res[, "Race"]), ]  # order output
#       Sex              Race Maj.count Maj.share
# 1  Female             Black         2      0.04
# 10   Male             Black         0      0.00
# 2  Female           Hawiian         1      0.02
# 3  Female          Hispanic         1      0.02
# 11   Male          Hispanic         0      0.00
# 4  Female Two or More Races         2      0.04
# 12   Male Two or More Races         0      0.00
# 5  Female             White        44      0.88
# 13   Male             White         0      0.00
# 6  Female             Asian         0      0.00
# 14   Male             Asian         0      0.00
# 7  Female        Am. Indian         0      0.00
# 15   Male        Am. Indian         0      0.00
# 8  Female          Hawaiian         0      0.00
# 16   Male          Hawaiian         0      0.00
# 9  Female      Not Reported         0      0.00
# 17   Male      Not Reported         0      0.00

数据

relevant.races <- c("Asian","Black", "Am. Indian", "Hawaiian" , "Hispanic", "White", 
                    "Two or More Races", "Not Reported")

Enroll_MajorA <- structure(c("Major A", "Major A", "Major A", "Major A", "Major A", 
"Major A", "Major A", "Major A", "Major A", "Major A", "Major A", 
"Major A", "Major A", "Major A", "Major A", "Major A", "Major A", 
"Major A", "Major A", "Major A", "Major A", "Major A", "Major A", 
"Major A", "Major A", "Major A", "Major A", "Major A", "Major A", 
"Major A", "Major A", "Major A", "Major A", "Major A", "Major A", 
"Major A", "Major A", "Major A", "Major A", "Major A", "Major A", 
"Major A", "Major A", "Major A", "Major A", "Major A", "Major A", 
"Major A", "Major A", "Major A", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "White", "White", 
"White", "Hawiian", "White", "White", "White", "White", "White", 
"White", "White", "White", "White", "Two or More Races", "White", 
"White", "White", "White", "White", "White", "White", "Hispanic", 
"White", "White", "White", "White", "White", "White", "Two or More Races", 
"White", "White", "White", "White", "White", "White", "White", 
"White", "Black", "White", "White", "Black", "White", "White", 
"White", "White", "White", "White", "White", "White", "White"
), .Dim = c(50L, 3L), .Dimnames = list(NULL, c("Maj", "Sex", 
"Race")))

【讨论】:

  • @Cath 现在应该很合适了 :)
  • @Cath 我差点怀疑了。^^
【解决方案2】:

一种使用tidyverse 的方法使用.drop = FALSE,其中包括缺失因子水平

library(tidyverse)

Enroll_MajorA %>%
   group_by(Race, Sex, .drop = FALSE) %>%
   summarise(count = n()) %>%
   ungroup() %>%
   mutate(perc = count/sum(count)) %>%
   gather(key, value, -Sex, -Race) %>%
   unite(Race, Race, key) %>%
   spread(Race, value)

数据

正如@Cath 所评论的,我们需要明确地包含数据中的所有级别。

Maj <- rep("Major A", times=50)
set.seed(24601) 
Race <- factor(sample(c("Asian","Black", "Am Indian","Hawiian" ,"Hispanic","White","Two or More Races","Not Reported"),
           prob=c(.01,.1,.01,.01,.02,.80,.05,.01),size=50, replace = T), 
           levels=c("Asian","Black", "Am Indian","Hawiian" ,"Hispanic","White","Two or More Races","Not Reported"))
Sex <- factor(sample(c("Female","Male"), prob=c(.98,.02),size=50,replace=T), levels = c("Female","Male"))

Enroll_MajorA <- data.frame(Maj,Sex,Race)

【讨论】:

  • 这看起来和上面的答案遇到了同样的问题。即使数据集中没有“亚洲人”,我仍然需要在表中列出“亚洲人”。
  • @asokol 更新了答案以包括所有级别。
  • 感谢您的帮助。我对tidyverse 不熟悉,而且我是R 的新手。我可以关注你的mutate 行,你能解释一下gatherunite 行在做什么吗?
  • @asokol gather 将数据从宽格式转换为长格式,unite 将两列中的数据合并为一列。我建议逐行运行以更好地理解它。
猜你喜欢
  • 1970-01-01
  • 2019-05-22
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2012-05-31
  • 2021-10-07
相关资源
最近更新 更多