R -按列拆分数据框并保留一组公共列的方法

  • 本文关键字:一组 方法 保留 拆分 数据 r
  • 更新时间 :
  • 英文 :


我的问题与这个非常相似,但我更喜欢有一个整洁的方法。

我有一个有几个列的数据集,我想按列拆分它(而不是按行)!),但是在每个数据集中保留一个公共列的列表。为了说明这一点,我将使用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

最新更新