我的问题与这个非常相似,但我更喜欢有一个整洁的方法。
我有一个有几个列的数据集,我想按列拆分它(而不是按行)!),但是在每个数据集中保留一个公共列的列表。为了说明这一点,我将使用iris
数据集,假设Species
是我想要保留的公共列。
用这些简单的操作就可以做到:
iris1 <- iris[,c("Species", "Sepal.Width")]
iris2 <- iris[,c("Species", "Sepal.Length")]
iris3 <- iris[,c("Species", "Petal.Width")]
iris4 <- iris[,c("Species", "Petal.Length")]
所以我想要实现与此相同的输出,但在一个整洁的风格和可用的管道而不破坏它。
一种方法是创建一个函数,从虹膜中提取物种和您选择的列(编号或名称),然后将这些列编号映射到您的函数中。
library(dplyr)
make_df <- function(col) { iris %>% select(Species, {{ col }} )}
c(2,1,4,3) %>% purrr::map(make_df)
或作为一行:
c(2,1,4,3) %>% map(~iris %>% select(Species, {{ .x }}))
这将输出一个包含四个元素的列表,每个元素都是您所描述的数据帧。对于许多工作流来说,这将比在全局环境中创建四个自由浮动的数据帧更安全、更方便。
c(2,1,4,3) %>% map(make_df) %>% map(head)
[[1]]
Species Sepal.Width
1 setosa 3.5
2 setosa 3.0
3 setosa 3.2
4 setosa 3.1
5 setosa 3.6
6 setosa 3.9
[[2]]
Species Sepal.Length
1 setosa 5.1
2 setosa 4.9
3 setosa 4.7
4 setosa 4.6
5 setosa 5.0
6 setosa 5.4
[[3]]
Species Petal.Width
1 setosa 0.2
2 setosa 0.2
3 setosa 0.2
4 setosa 0.2
5 setosa 0.2
6 setosa 0.4
[[4]]
Species Petal.Length
1 setosa 1.4
2 setosa 1.4
3 setosa 1.3
4 setosa 1.5
5 setosa 1.4
6 setosa 1.7