我有一个看起来像这样的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)
在这里,我可以看到我想要提取的数据和情节是在&#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&#;问题变量。
我知道,当有一种更简单的方法可以实现相同的目标时,我可能会尝试做一些非常复杂的事情,因此可以接受建议。
答案 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")