如何以整洁的格式从 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")
我有一个 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")