首页 > 解决方案 > 组合多个具有相似非连续名称的数据框

问题描述

我在 R 中有几个名称相似的数据框:“datafile_20180801”、“datafile_20180802”、... --> 它们都以“datafile_”开头,后跟提取日期。它们具有相同的列名,我如何将它们堆叠到 R 中的一个数据框中,而不必将每个名称都输入到 rbind 中?(我说的是 30 多个数据帧)

提前致谢!

标签: rrbind

解决方案


该问题没有提供可重现的数据,因此我们在最后的注释中使用了可重现的数据。问题指出列名“相似,我们假设这意味着所有数据框都具有相同的列名。

让我们env定义数据框所在的环境。下面我们假设它是全局环境。(请注意,env两者中的默认值lsmget是全局环境,因此在这种情况下,另一种可能性是忽略env两个实例中的参数。)列出该环境中与指定的正则表达式匹配的名称Namesmget然后使用给定列表获取对象本身L,并使用 将 的组件绑定L在一起rbind。结果的行名称将指示每行来自哪个数据框。不使用任何包。

env <- .GlobalEnv
Names <- ls(pattern = "^datafile_\\d{8}$", env)
L <- mget(Names, env)
do.call("rbind", L)

使用末尾注释中可重复显示的数据给出以下内容:

                    Time demand
datafile_20180801.1    1    8.3
datafile_20180801.2    2   10.3
datafile_20180801.3    3   19.0
datafile_20180801.4    4   16.0
datafile_20180801.5    5   15.6
datafile_20180801.6    7   19.8
datafile_20180802.1   10   83.0
datafile_20180802.2   20  103.0
datafile_20180802.3   30  190.0
datafile_20180802.4   40  160.0
datafile_20180802.5   50  156.0
datafile_20180802.6   70  198.0

上面最后一行代码的替代方法是使用bind_rowsdplyr。它不会创建标识每行来源的行名,而是创建一个新id列来执行此操作。

library(dplyr)
bind_rows(L, .id = "id")

给出以下但带有警告(如果我们首先将因子列转换为字符可以避免):

                  id Time demand
1  datafile_20180801    1    8.3
2  datafile_20180801    2   10.3
3  datafile_20180801    3   19.0
4  datafile_20180801    4   16.0
5  datafile_20180801    5   15.6
6  datafile_20180801    7   19.8
7  datafile_20180802   10   83.0
8  datafile_20180802   20  103.0
9  datafile_20180802   30  190.0
10 datafile_20180802   40  160.0
11 datafile_20180802   50  156.0
12 datafile_20180802   70  198.0

如果需要,我们可以使用 magrittr 来表达上述内容:

library(magrittr)

.GlobalEnv %>%
   mget(ls(pattern = "^datafile_\\d{8}$", .), .) %>%
   do.call("rbind", .)

笔记

我们利用内置数据框BOD来创建可重现的输入。

datafile_20180801 <- transform(BOD, Time = factor(Time))
datafile_20180802 <- transform(BOD, Time = factor(10*Time), demand = 10 * demand)

推荐阅读