提问人:stats_noob 提问时间:12/8/2021 最后编辑:Markstats_noob 更新时间:8/19/2023 访问量:171
R:将数据拆分为所有可能的“因子”组合
R: Splitting Data Into All Possible "Factor" Combinations
问:
我正在使用 R 编程语言。假设我有以下数据集:
library(tidyverse)
set.seed(0)
vars <- list(c("A","B"), c("AA","BB", "CC"), c("AA1","BB1"))
probs <- list(c(0.3, 0.7), c(0.2, 0.1, 0.7), c(0.5, 0.5))
setNames(map2_dfc(vars, probs, ~ .x |> sample(1000, replace=TRUE, prob=.y) |> as.factor()), paste0("var_", 1:3)) |>
mutate(var_4 = rnorm(1000,10,10),
var_5 = rnorm(1000,10,10),
var_6 = rnorm(1000,10,10))
# A tibble: 1,000 × 6
var_1 var_2 var_3 var_4 var_5 var_6
<fct> <fct> <fct> <dbl> <dbl> <dbl>
1 A CC BB1 10.8 4.68 6.24
2 B CC AA1 9.49 6.30 8.86
3 B CC AA1 7.39 21.7 12.9
4 B CC AA1 25.7 5.35 24.6
5 A BB BB1 6.28 6.98 19.9
6 B CC BB1 27.4 23.9 15.6
7 A CC BB1 -0.989 5.50 19.4
8 A CC AA1 18.7 1.53 12.6
9 B CC BB1 15.3 9.67 -2.20
10 B AA AA1 -3.94 11.5 16.4
# ℹ 990 more rows
我的问题:在上述数据中,有 3 个因子变量,这些因子共有 12 种可能的组合。我正在尝试提取这些组合中的每一个,并创建 12 个新数据集,专用于这些组合中的每一个。
我在 R 中尝试了以下代码:
lst1 <- split(my_data, my_data[c("var_1", "var_2", "var_3")], drop = TRUE)
然后,我尝试从此列表中提取这些数据集中的每一个:
list2env(lst1,envir=.GlobalEnv)
有人可以告诉我我所做的是否正确吗?如果有更多的变量和更多的因子组合 - 是否有更有效的方法来解决这个问题?
谢谢!
答: 暂无答案
评论
library(data.table); dtcars <- data.table(mtcars); dtcars[, mean(mpg), keyby=.(cyl, am)]
split
是按一个或多个分组变量的级别拆分数据框的标准方法,也是从命名列表到环境的多重分配的标准方法。如果这是您想要实现的,那么您的代码是合理的,前提是您希望每个观察到的组合有 1 个数据帧。可能的 12 种组合中的任何一种都可能偶然未被观察到。在这种情况下,您最终会得到少于 12 个数据帧。list2env