按因子变量分组后嵌套 tibbles 会在 R 中生成 NULL 元素



当我偶然发现几个错误时,我正在审查我的一些旧R代码。

在运行每一行并处理我的数据后,我发现tidyr::nest()tibbledplyr::group(ed)_by因子变量会产生一个或多个 NULL 元素。

下面是一个包含 mtcars 数据的示例:

library(dplyr)
library(tidyr)
mtcars %>% 
as_tibble() %>% 
select(cyl, carb, mpg) %>% 
mutate(cyl = factor(cyl),
carb = factor(carb)) %>% 
group_by(cyl, carb) %>% 
nest()
# A tibble: 9 x 3
# cyl   carb  data            
# <fct> <fct> <list>          
#   1 6     4     <NULL>          
#   2 4     1     <tibble [5 x 1]>
#   3 6     1     <tibble [3 x 1]>
#   4 8     2     <NULL>          
#   5 8     4     <NULL>          
#   6 4     2     <tibble [6 x 1]>
#   7 8     3     <NULL>          
#   8 6     6     <NULL>          
#   9 8     8     <NULL> 

我认为nest()正在考虑因素as.numeric(),当不同的变量呈现同名组时"变得困惑"。但后来我尝试了:

mtcars %>% 
as_tibble() %>% 
select(cyl, carb, mpg) %>%  
mutate(cyl = factor(cyl) %>% as.numeric(),
carb = factor(carb) %>% as.numeric()) %>% 
group_by(cyl, carb) %>% 
nest()

并得到与使用非因子变量嵌套时相同的结果:

# A tibble: 9 x 3
# cyl  carb data            
# <dbl> <dbl> <list>          
#   1     2     4 <tibble [4 x 1]>
#   2     1     1 <tibble [5 x 1]>
#   3     2     1 <tibble [2 x 1]>
#   4     3     2 <tibble [4 x 1]>
#   5     3     4 <tibble [6 x 1]>
#   6     1     2 <tibble [6 x 1]>
#   7     3     3 <tibble [3 x 1]>
#   8     2     5 <tibble [1 x 1]>
#   9     3     6 <tibble [1 x 1]>

儗:

mtcars %>% 
as_tibble() %>% 
select(cyl, carb, mpg) %>% 
group_by(cyl, carb) %>% 
nest()
# A tibble: 9 x 3
# cyl  carb data            
# <dbl> <dbl> <list>          
#   1     6     4 <tibble [4 x 1]>
#   2     4     1 <tibble [5 x 1]>
#   3     6     1 <tibble [2 x 1]>
#   4     8     2 <tibble [4 x 1]>
#   5     8     4 <tibble [6 x 1]>
#   6     4     2 <tibble [6 x 1]>
#   7     8     3 <tibble [3 x 1]>
#   8     6     6 <tibble [1 x 1]>
#   9     8     8 <tibble [1 x 1]>

由于我的代码在上个月之前一直工作正常,我想知道tidyr最近是否更新了,并且按nest()处理因子组的方式发生了变化?

通常是否建议不要嵌套按因子变量分组的数据,或者更确切地说,不要group_by()因子变量?

编辑:在aosmith提到的问题中,Hadley引用了似乎可以解决问题的group_nest()(警告:此函数重新排序tibble!尽管如此,我仍然想知道为什么nest()会产生 NULL...

mtcars %>% 
as_tibble() %>% 
select(cyl, carb, mpg) %>% 
mutate(cyl = factor(cyl),
carb = factor(carb)) %>% 
group_by(cyl, carb) %>%
group_nest() %>% 
unnest %>% 
all.equal(.,
mtcars %>% 
as_tibble() %>% 
select(cyl, carb, mpg) %>% 
mutate(cyl = factor(cyl),
carb = factor(carb)))
# [1] TRUE

正如 aosmith 所建议的那样,这最近在 tidyr 的开发版本中得到了修复。由于我没有从链接的问题中认识到这一点,并且我无法设法安装开发版本,因此我将此问题作为另一个问题提交。哈德利刚刚回答了这个问题。

最新更新