如何以整洁的格式从 hmisc 中的 describe 函数中提取值以便绘制输出图形?

How do I extract values from describe function in hmisc, in tidy format in order to graph the output?

我有一个 data.frame 看起来像这样:

    # A tibble: 2,003 x 16
   barcost barrulesplay barrulessch barrulesrelax barrulesinjury barriskskills barraincold barrainsick barrainmessy barraininjury barrainparentdis… barrainchilddis… barrainchildclo…
     <int>        <int>       <int>         <int>          <int>         <int>       <int>       <int>        <int>         <int>             <int>            <int>            <int>
 1       3            4           3             4              4             4          NA          NA           NA            NA                NA               NA               NA
 2       2            5           5             5              3             5          NA          NA           NA            NA                NA               NA               NA
 3       2            2           2             3              2             4          NA          NA           NA            NA                NA               NA               NA
 4       2            4           4             4              2             4          NA          NA           NA            NA                NA               NA               NA
 5       2            3           3             4              2             4          NA          NA           NA            NA                NA               NA               NA
 6       2            4           4             4              3             4          NA          NA           NA            NA                NA               NA               NA
 7       3            5           5             4              2             4          NA          NA           NA            NA                NA               NA               NA
 8       4            5           5             4              4             3          NA          NA           NA            NA                NA               NA               NA
 9       1            5           5             5              3             5          NA          NA           NA            NA                NA               NA               NA
10       2            4           4             4              3             4          NA          NA           NA            NA                NA               NA               NA

当我按如下方式使用 "describe" 函数形式 hmisc 时,我得到了一个列表列表(如预期的那样):

describe(questions)

在这里我可以看到我想要提取的数据和绘图在这个列表列表的 "values" 下的 "frequency" 中。

我将如何创建一个整洁的 data.frame,其中每一列的频率为 1、2、3 等,在上面的 "describe" 函数的列表输出中?:

summary[["barcost"]][["values"]]

$value
[1] 1 2 3 4 5

$frequency
[1] 348 806 410 360  79

所以 data.frame 将列 headers 作为变量(例如在列名称 "questions" 下)然后(使用 "barcost" 问题的示例上面)348 个 1、806 个 2 等都是 "barcost" 问题变量。

我知道当有更简单的方法可以实现相同的目标时,我可能会尝试做一些非常复杂的事情,所以愿意接受建议。

您可以更直接地按列获取频率。 gather会将数据转换为"long"格式,方便分组制表。

library(tidyverse)

freq = gather(questions) %>% group_by(key, value) %>% tally

然后您可以绘制结果图,例如,像这样:

ggplot(freq, aes(value, n)) +
  geom_col() +
  facet_wrap(~ key)

如果我们从 describe 的输出开始,您可以这样做:

freq = map_df(describe(questions), ~.x$values, .id="Column")

但是,describe 不会 return 具有少于三个唯一值的列的频率,因此这种方法将从生成的 freq 数据框中排除任何此类列。

更新:如果我理解你的评论,这里有一种基于值比例的颜色方法:

# Fake data
set.seed(2)
dat = replicate(10, sample(1:5, 50, replace=TRUE))

# Get frequencies and proportions
freq = dat %>% as.data.frame %>% 
  gather() %>% 
  group_by(key, value) %>% 
  tally %>% 
  mutate(pct=n/sum(n))

ggplot(freq, aes(value, n, fill=pct)) +
  geom_col() +
  facet_wrap(~ key, ncol=5) +
  scale_fill_gradient(low="red", high="blue")