如何创建具有 1 个自变量和 3 个因变量的计数和百分比表和折线图
Posted
技术标签:
【中文标题】如何创建具有 1 个自变量和 3 个因变量的计数和百分比表和折线图【英文标题】:How to create count and percentage tables and linegraphs with 1 independent variable and 3 dependent ones 【发布时间】:2019-02-19 19:03:43 【问题描述】:我是一个R新手,不知何故,这个问题似乎应该很容易解决。但不幸的是,经过大约三天的搜索和实验,我还是无法做到这一点。
我的数据格式接近宽格式:
color agegroup sex ses
red 2 Female A
blue 2 Female C
green 5 Male D
red 3 Female A
red 2 Male B
blue 1 Female B
...
我正在尝试创建可展示的表格,其中包含由sex
、ses
和agegroup
组织的因变量(此处为color
)的计数和百分比。我需要一个由ses
和sex
为每个agegroup
组织的表格,百分比旁边有计数,如下所示:
agegroup: 1
sex: Female Male
ses: A B C D A B C D
color:
red 2 1% 0 0% 8 4% 22 11% 16 8% 2 1% 8 4% 3 1.5%
blue 9 4.5% 6 3% 4 2% 2 1% 12 6% 32 16% 14 7% 6 3%
green 4 2% 12 6% 2 1% 8 4% 0 0% 22 11% 40 20% 0 0%
agegroup: 2
sex: Female Male
ses: A B C D A B C D
color:
red 2 1% 0 0% 8 4% 22 11% 16 8% 2 1% 8 4% 3 1.5%
blue 9 4.5% 6 3% 4 2% 2 1% 12 6% 32 16% 14 7% 6 3%
green 4 2% 12 6% 2 1% 8 4% 0 0% 22 11% 40 20% 0 0%
我一直在尝试使用从 datatables
和 expss
到 gmodels
的所有内容来执行此操作,但我就是不知道如何获得这样的输出。来自gmodels
的CrossTables
最接近,但距离仍然很远——(1)它把百分比放在 计数之下,(2)我不能让它嵌套在@ 下的sel
987654336@,(3)我不知道如何让它按代分解结果,以及(4)输出充满破折号、垂直管道和空格,这使得将其放入文字处理器或电子表格时出错- 容易发生手工事务。
编辑:我删除了我的第二个问题(关于线图),因为第一个问题的答案是完美的并且值得称赞,即使它没有触及第二个问题。我会单独问第二个问题,就像我从一开始就应该问的那样。
【问题讨论】:
janitor::tabyl
可能值得一看。
我很欣赏这个建议。两个变量表工作正常(尽管它们不是我需要的)。但是,当我尝试添加第三个变量时,它会引发一个我无法解读的错误(class
表明我正在处理的对象是一个数据帧):类中的错误(dat[[1]]) 1 并且仅使用第一个元素 2:在 if (new_class %in% "factor") : 条件长度 > 1 并且只使用第一个元素
我需要 4 路桌(即多个 3 路桌),而tabyl
似乎仅限于 3 路。它似乎无法从我的示例中生成“可展示的表格”。
【参考方案1】:
与expss
包最接近的结果:
library(expss)
# generate example data
set.seed(123)
N = 300
df = data.frame(
color = sample(c("red", "blue", "green"), size = N, replace = TRUE),
agegroup = sample(1:5, size = N, replace = TRUE),
sex = sample(c("Male", "Female"), size = N, replace = TRUE),
ses = sample(c("A", "B", "C", "D"), size = N, replace = TRUE),
stringsAsFactors = FALSE
)
# redirect output to RStudio html viewer
expss_output_viewer()
res = df %>%
tab_cells("|" = color) %>% # dependent variable, "|" used to suppress label
tab_cols(sex %nest% ses) %>% # column variable
tab_rows(agegroup) %>%
tab_total_row_position("none") %>% # we don't need total
tab_stat_cases(label = "Cases") %>% # calculate cases
tab_stat_cpct(label = "%") %>% # calculate percent
tab_pivot(stat_position = "inside_columns") %>% # finalize table
make_subheadings(number_of_columns = 2)
# difficult part - add percent sign
for(i in grep("%", colnames(res)))
res[[i]] = ifelse(trimws(res[[i]])!="",
paste0(round(res[[i]], 1), "%"),
res[[i]]
)
# additionlly remove stat labels
colnames(res) = gsub("\\|Cases|%", "", colnames(res), perl = TRUE)
res
在 RStudio 查看器中,结果将采用 HTML 格式(见图)。不幸的是,我无法测试它将如何粘贴到 MS Word。
免责声明:我是expss
包的作者。
【讨论】:
很好!!这会产生完全符合我需要的形状的表格!非常感谢。两个后续问题...由于粘贴 HTML 有点容易出错,我希望粘贴纯文本,然后手动制作。 (1) 但是如果我使用expss_output_raw
,表头会被展平和交错(例如row_labels Female|A Female|A| Female|B Female|B|
),而不是第一行有sex
,第二行有ses
。我怎样才能实现第二种格式? (2) 在agegroup
行中,我在每一列中得到NA <NA>
,此时整行应该为空,但标签除外。建议?再次感谢!
@GilWilliams 试试expss_output_default()
@GilWilliams 另一种方法 - 使用制表符分隔符将表格拖放到文本文件:fwrite(split_table_to_df(res), "table.tab", sep = "\t", col.names = FALSE, quote = FALSE)
您,先生,是 R 表的 Jimi Hendrix。再次感谢!
@GilWilliams 我们可以用writeLines(paste0('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />', htmlTable(res)), "table.html")
来做到这一点。【参考方案2】:
您可以使用 janitor 包中的 adorn_ns(position = "front")
。它会同时为您提供计数和百分比。
例如这段代码:
df %>%
arrange(desc(all)) %>%
adorn_percentages("col") %>%
adorn_pct_formatting() %>%
adorn_ns(position = "front") %>%
as.data.frame()
给出这个输出:
【讨论】:
以上是关于如何创建具有 1 个自变量和 3 个因变量的计数和百分比表和折线图的主要内容,如果未能解决你的问题,请参考以下文章