我在R中有几个具有相似名称的数据帧: “ datafile_20180801”,“ datafile_20180802”,...->它们都以'datafile_'开头,后跟提取日期。 它们具有相同的列名,如何将它们堆叠到R中的一个数据框中,而不必在rbind中键入每个名称? (我说的是30多个数据帧)
谢谢!
答案 0 :(得分:1)
该问题未提供可复制的数据,因此我们在末尾的注释中使用了可复制的数据。该问题指出列名“相似,我们假设这意味着所有数据帧都具有相同的列名。
让env
定义数据帧所在的环境。下面我们假设这是全球环境。 (请注意,env
和ls
中mget
的默认值是全局环境,因此在这种情况下的另一种可能性是在两个实例中都省略env
参数。)列出该环境中与指定的正则表达式匹配的名称,并给出Names
。然后使用mget
获取对象本身,并给出列表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
上面最后一行代码的替代方法是使用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)