在按多个组拆分时,如何确保 setNames() 将正确的名称归因于我的 group_split() 数据集?

How to ensure the setNames() attributes the correct names to my group_split() datasets when splitting by multiple groups?

作为这个问题的后续,我正在使用 dplyr 的 group_split() 根据列的级别制作数据帧/小标题。继续这个 question,我想拆分两列而不是一列。当我尝试拆分和命名列时,它将错误的名称归因于某些数据集。

这是一个简单的例子:

library(dplyr)
#Sample dataset to intuitively illustrate issue
example <- tibble(number = c(1:6),
                  even_or_odd = c("odd", "even", "odd", "even", "odd", "even"),
                  prime_or_not = c("prime", "prime", "prime", "not", "prime", "not")) %>%
  mutate(type = paste0(even_or_odd, "_", prime_or_not)) %>%
  mutate(type_factor = factor(type, levels = unique(type)))

#Does group split to make 3 datasets
the_test <- example %>%
  group_split(even_or_odd, prime_or_not) %>%
  setNames(unique(example$type_factor))

#The data sets with some being correct but others not
even_prime <- the_test["even_prime"]$even_prime #works!
even_not <- the_test["even_not"]$even_not #wrong label :`-(
odd_prime <- the_test["odd_prime"]$odd_prime #wrong label :`-(
odd_not <- the_test["odd_not"]$odd_not #works--correctly throws an error!

我的问题:我如何确保将我的组名称归因于正确的数据集,并避免混淆 even_not 和 odd_prime 的问题?

在我的实际数据集中,我有 50 多种组合,因此无法手动输入所有组合。此外,我的实际数据集会有一些不一致存在的组合(比如(比如这里的奇数非素数组合),所以依赖索引不是一个选项。

不要按两列​​拆分,而是使用创建的因子列,这可确保它按在 type_factor 中创建的 levels 的顺序拆分。此外,如果 'type_factor' 中值的顺序不同,即 unique 获取第一个 non-duplicated 值,则在 type_factor 上使用 unique 可能会出现一些问题在它的发生。相反,levels 更好。事实上,在未使用级别的情况下,droplevels 可能更合适。

the_test <- example %>%
  group_split(type_factor) %>% 
  setNames(levels(example$type_factor))

group_split return 未命名 list。如果我们想避免错误重命名的痛苦,请使用 base R 中的 split,它会 return 命名为 list。因此,只要 key/value 对

正确,它就可以按任何顺序 return
# 1 - return in a different order based on alphabetic order
split(example, example[c("even_or_odd", "prime_or_not")], drop = TRUE)

# 2 - return order based on the levels of the factor column
split(example, example$type_factor)
# 3 - With dplyr pipe
example %>% 
       split(.$type_factor)
# 4 - or using magrittr exposition operator
library(magrittr)
example %$%
      split(x = ., f = type_factor)

哦,当然,在我 post 它的那一刻,我意识到存在一个简单的解决方案:

只需将组拆分更改为新变量即可!

library(dplyr)

#Does group split to make 3 datasets
the_test <- example %>%
  group_split(type_factor) %>%
  setNames(unique(example$type_factor))

#The data sets with some being correct but others not
even_prime <- the_test["even_prime"]$even_prime #works!
even_not <- the_test["even_not"]$even_not #works now!
odd_prime <- the_test["odd_prime"]$odd_prime #works now!
odd_not <- the_test["odd_not"]$odd_not #works--correctly throws an error!