同时创建多个子集

Create several subsets at the same time

我有一个数据集 (insti),我想根据具有三个级别(linkedin、instagram、twitter)的因素 (xarxa) 创建 3 个不同的子集。 我用过这个:

linkedin <- subset(insti, insti$xarxa=="linkedin")
twitter <- subset(insti, insti$xarxa=="twitter")
instagram <- subset(insti, insti$xarxa=="instagram")

它确实有效,但是,我想知道这是否可以通过 tapply 完成,所以我尝试了:

tapply(insti, insti$xarxa, subset)

它给出了这个错误:

Error in tapply(insti, insti$xarxa, subset) :  arguments must have same length

我认为可能有一些直接的方法可以做到这一点,但我无法解决。你能在不使用循环的情况下帮助我吗? 非常感谢。

处理命名列表中的数据帧通常更好。这使它们易于迭代,并阻止您的全局工作区被许多不同的变量填满。获取命名列表的最简单方法是使用 split(insti, insti$xarxa).

如果您确实希望将变量直接写入您的全局环境而不是单行列表,您可以这样做

list2env(split(insti, insti$xarxa), globalenv())

例子

显然,我没有 insti 数据框,因为您没有在问题中提供任何示例数据,但我们可以证明上述解决方案使用内置 iris 数据集.

首先我们可以看到我的全局环境是空的:

ls()
#> character(0)

现在我们得到iris数据集,按物种拆分,结果放到全局环境中:

list2env(split(datasets::iris, datasets::iris$Species), globalenv())
#> <environment: R_GlobalEnv>

所以现在当我们检查全局环境的内容时,我们可以看到我们有三个数据框:每个 Species:

ls()
#> [1] "setosa"     "versicolor" "virginica"

head(setosa)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1          5.1         3.5          1.4         0.2  setosa
#> 2          4.9         3.0          1.4         0.2  setosa
#> 3          4.7         3.2          1.3         0.2  setosa
#> 4          4.6         3.1          1.5         0.2  setosa
#> 5          5.0         3.6          1.4         0.2  setosa
#> 6          5.4         3.9          1.7         0.4  setosa

当然,我们也可以用同样的方式访问versicolorvirginica

reprex package (v2.0.0)

创建于 2021-11-12