同时创建多个子集
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
当然,我们也可以用同样的方式访问versicolor
和virginica
由 reprex package (v2.0.0)
创建于 2021-11-12
我有一个数据集 (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
当然,我们也可以用同样的方式访问versicolor
和virginica
由 reprex package (v2.0.0)
创建于 2021-11-12