如何在 R 中将一个数据集分割成多个数据集

How to slice a dataset into multiple dataset in R

对于这个例子,我将使用 iris R 中内置的数据集。

如何避免复制和粘贴以下语法以获得相同的输出?

套餐

library(dplyr)

输入

head(iris)

#  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

手动解决

我必须根据列名称对我的数据集进行子集化。 我知道如何“手动”执行此操作,但它需要在我当前的数据集上进行大量复制和粘贴操作。

Sepal <- iris %>% select(contains("Sepal")) 
Petal <- iris %>% select(contains("Petal")) 

输出

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

如何使这个过程自动化?我想我可以在这里使用 purrr 包。但是我找不到办法。

您可以使用

library(tidyverse)

map(set_names(c("Sepal", "Petal")), ~ select(iris, starts_with(.x)))

输出(头部)

$Sepal
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
4          4.6         3.1
5          5.0         3.6
6          5.4         3.9

$Petal
  Petal.Length Petal.Width
1          1.4         0.2
2          1.4         0.2
3          1.3         0.2
4          1.5         0.2
5          1.4         0.2
6          1.7         0.4

一个选项也是在列名的子字符串上使用 split.default 到 return list of data.frames

library(dplyr)
library(stringr)
head(iris) %>% 
 select(-Species) %>%
 split.default(str_remove(names(.), "\..*"))
$Petal
  Petal.Length Petal.Width
1          1.4         0.2
2          1.4         0.2
3          1.3         0.2
4          1.5         0.2
5          1.4         0.2
6          1.7         0.4

$Sepal
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
4          4.6         3.1
5          5.0         3.6
6          5.4         3.9