如何使用 Purrr::map 创建跨因子变量百分比的多频率表
How to Create Multiple Frequency Tables with Percentages Across Factor Variables using Purrr::map
library(tidyverse)
library(ggmosaic) for "happy" dataset.
我觉得这应该是一件比较容易实现的事情,但是当我将 purrr::map 与 table() 一起使用时,我在百分比方面遇到了困难。使用 "happy" 数据集,我想为每个因子变量创建一个频率列表 tables。我还希望使用四舍五入的百分比而不是计数,或者如果可能的话两者都使用。
我可以使用下面的代码分别为每个因子变量创建频率百分比。
with(happy,round(prop.table(table(marital)),2))
然而,当使用 table() 和 purrr::map 时,我似乎无法使百分比正常工作。下面的代码不起作用...
happy%>%select_if(is.factor)%>%map(round(prop.table(table)),2)
我尝试的第二种方法是使用 tidyr::gather,并使用 dplyr::mutate 计算百分比,然后拆分数据并使用 tidyr::spread 传播。
TABLE<-happy%>%select_if(is.factor)%>%gather()%>%group_by(key,value)%>%summarise(count=n())%>%mutate(perc=count/sum(count))
但是,由于存在不同的因子变量,在使用 purrr::map 和 tidyr::spread 传播之前,我必须将数据按 "key" 拆分,这接近于产生一些有用的输出除了行和 NA 中的重复 "key" 值。
TABLE%>%split(TABLE$key)%>%map(~spread(.x,value,perc))
因此,如果您能提供有关如何使上述两种方法都起作用的任何帮助,我们将不胜感激...
您可以使用匿名函数或公式来让您的第一个选项生效。这是公式选项。
happy %>%
select_if(is.factor) %>%
map(~round(prop.table(table(.x)), 2))
在您的第二个选项中,删除 NA
值然后在传播之前删除 count
变量会有所帮助。但是,结果中的顺序已更改。
TABLE = happy %>%
select_if(is.factor) %>%
gather() %>%
filter(!is.na(value)) %>%
group_by(key, value) %>%
summarise(count = n()) %>%
mutate(perc = round(count/sum(count), 2), count = NULL)
TABLE %>%
split(.$key) %>%
map(~spread(.x, value, perc))
library(tidyverse)
library(ggmosaic) for "happy" dataset.
我觉得这应该是一件比较容易实现的事情,但是当我将 purrr::map 与 table() 一起使用时,我在百分比方面遇到了困难。使用 "happy" 数据集,我想为每个因子变量创建一个频率列表 tables。我还希望使用四舍五入的百分比而不是计数,或者如果可能的话两者都使用。
我可以使用下面的代码分别为每个因子变量创建频率百分比。
with(happy,round(prop.table(table(marital)),2))
然而,当使用 table() 和 purrr::map 时,我似乎无法使百分比正常工作。下面的代码不起作用...
happy%>%select_if(is.factor)%>%map(round(prop.table(table)),2)
我尝试的第二种方法是使用 tidyr::gather,并使用 dplyr::mutate 计算百分比,然后拆分数据并使用 tidyr::spread 传播。
TABLE<-happy%>%select_if(is.factor)%>%gather()%>%group_by(key,value)%>%summarise(count=n())%>%mutate(perc=count/sum(count))
但是,由于存在不同的因子变量,在使用 purrr::map 和 tidyr::spread 传播之前,我必须将数据按 "key" 拆分,这接近于产生一些有用的输出除了行和 NA 中的重复 "key" 值。
TABLE%>%split(TABLE$key)%>%map(~spread(.x,value,perc))
因此,如果您能提供有关如何使上述两种方法都起作用的任何帮助,我们将不胜感激...
您可以使用匿名函数或公式来让您的第一个选项生效。这是公式选项。
happy %>%
select_if(is.factor) %>%
map(~round(prop.table(table(.x)), 2))
在您的第二个选项中,删除 NA
值然后在传播之前删除 count
变量会有所帮助。但是,结果中的顺序已更改。
TABLE = happy %>%
select_if(is.factor) %>%
gather() %>%
filter(!is.na(value)) %>%
group_by(key, value) %>%
summarise(count = n()) %>%
mutate(perc = round(count/sum(count), 2), count = NULL)
TABLE %>%
split(.$key) %>%
map(~spread(.x, value, perc))