在按多个组拆分时,如何确保 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!
作为这个问题的后续,我正在使用 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 对
# 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!