当我偶然发现几个错误时,我正在审查我的一些旧R代码。
在运行每一行并处理我的数据后,我发现tidyr::nest()
tibble
的dplyr::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 的开发版本中得到了修复。由于我没有从链接的问题中认识到这一点,并且我无法设法安装开发版本,因此我将此问题作为另一个问题提交。哈德利刚刚回答了这个问题。