如何使用Purrr :: map

时间:2017-03-25 05:47:23

标签: r tidyverse purrr

library(tidyverse)
library(ggmosaic) for "happy" dataset. 

我觉得这应该是一个有点简单的事情,但是当使用purrr :: map和table()时,我的百分比有问题。使用“happy”数据集,我想为每个因子变量创建一个频率表列表。如果可能的话,我还希望得到舍入百分比而不是计数,或两者都有。

我可以使用下面的代码分别为每个因子变量创建频率预先。

with(happy,round(prop.table(table(marital)),2))

然而,当使用带有purrr :: map的table()时,我似乎无法使百分比正常工作。下面的代码不起作用......

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”,除了重复的“key”之外,它接近产生一些有用的输出“行中的值和NA。

TABLE%>%split(TABLE$key)%>%map(~spread(.x,value,perc))

因此,非常感谢任何有关如何使上述两种方法都有效的帮助...

1 个答案:

答案 0 :(得分:1)

您可以使用匿名函数或公式来获得第一个选项。这是公式选项。

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))