在purrr::map()中使用dplyr::count()处理字符变量报错的技术咨询
嘿,这个报错我太熟啦!咱们来拆解一下问题出在哪,再给你几个好用的修改方案~
错误原因拆解
你写的代码里,select_if(is.character)已经把flights数据框里的字符列挑出来了,但后面的map(., count)会把每个字符列单独提取成字符向量——而dplyr::count()是专门用来处理数据框的函数,它需要基于数据框的分组逻辑来统计,面对单独的向量自然就懵了,所以才会抛出那串关于groups方法找不到的错误。至于你说数值型变量用类似代码有效,应该是当时用的是能处理向量的函数(比如summary()或者table()),但count()确实不吃这一套。
修正方案
方案1:给每个向量套个数据框再计数
我们可以在map里先把每个向量转换成单列数据框,再用count()统计,这样就符合count()的要求了:
library(dplyr) library(purrr) library(tibble) # 用来创建 tibble,比 data.frame 更友好 nycflights13::flights %>% select_if(is.character) %>% map(~ tibble(value = .x) %>% count(value))
运行后会返回一个列表,每个元素对应原数据框里的一个字符列,里面是该列的频数统计结果。
方案2:把所有结果合并成一个统一的数据框(更推荐)
如果想把所有字符列的计数结果放在同一个数据框里查看,用imap_dfr()代替map()就行——它会自动把列名也带上:
nycflights13::flights %>% select_if(is.character) %>% imap_dfr(~ tibble(column_name = .y, value = .x) %>% count(column_name, value))
这样输出的是一个整洁的数据框,包含列名、列值和对应的频数,非常方便后续分析。
针对因子型变量的修改
你提到因子型变量也会报同类错,解决思路完全一样:把select_if(is.character)换成select_if(is.factor),再用上面的任意一种方案就行,比如:
nycflights13::flights %>% select_if(is.factor) %>% imap_dfr(~ tibble(column_name = .y, value = .x) %>% count(column_name, value))
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

