将多个数据帧与相似的非连续名称组合

时间:2018-08-20 14:18:16

标签: r rbind

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

谢谢!

1 个答案:

答案 0 :(得分:1)

该问题未提供可复制的数据,因此我们在末尾的注释中使用了可复制的数据。该问题指出列名“相似,我们假设这意味着所有数据帧都具有相同的列名。

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

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

上面最后一行代码的替代方法是使用dplyr中的bind_rows。代替创建标识每一行源的行名,它会创建一个新的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)