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

时间:2018-04-15 23:32:57

标签: r tidyverse hmisc

我有一个看起来像这样的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

当我使用&#34;描述&#34;函数表单hmisc如下,我得到一个列表列表(按预期):

describe(questions)

enter image description here

在这里,我可以看到我想要提取的数据和情节是在&#34;频率&#34;在&#34;价值观&#34;列表清单。

我如何创建一个整洁的data.frame,对于每列都有1&#39; s,2&#39; s,3&s等的频率,它们在列表输出中形成&#34 ;描述&#34;上面的功能?:

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

$value
[1] 1 2 3 4 5

$frequency
[1] 348 806 410 360  79

所以data.frame将列标题作为变量(在列名称&#34;问题&#34;例如)下然后(使用&#34; barcost&#34;上面的问题的示例)所有#34; barcost&#34;都是348 1&#39; s,806 2&#;问题变量。

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

1 个答案:

答案 0 :(得分:2)

您可以更直接地按列获取频率。 gather会将数据转换为“长”格式,这有助于按组进行制表。

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不会返回少于三个唯一值的列的频率,因此这种方法会从生成的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")

enter image description here