r - 组合多个具有相似非连续名称的数据框
问题描述
我在 R 中有几个名称相似的数据框:“datafile_20180801”、“datafile_20180802”、... --> 它们都以“datafile_”开头,后跟提取日期。它们具有相同的列名,我如何将它们堆叠到 R 中的一个数据框中,而不必将每个名称都输入到 rbind 中?(我说的是 30 多个数据帧)
提前致谢!
解决方案
该问题没有提供可重现的数据,因此我们在最后的注释中使用了可重现的数据。问题指出列名“相似,我们假设这意味着所有数据框都具有相同的列名。
让我们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
上面最后一行代码的替代方法是使用bind_rows
dplyr。它不会创建标识每行来源的行名,而是创建一个新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)
推荐阅读
- python-3.x - python 3的高效结果显示
- javascript - 承诺 then() 和 catch() UnhandledPromiseRejectionWarnin
- javascript - 当前 TabStrip 无法刷新
- sql - 使用 EF Core 的 SQL 连接
- python - 如何进行内部联接以仅获取保存在表中的值
- c# - 策略设计模式问题委托 c#
- sql - Apache spark窗口,根据某些条件选择上一个最后一项
- java - 未找到 Apache Commons CSV 映射
- laravel - Laravel 5.7:Eloquent Pivot 字段未使用 sync() 进行转换
- android - 无法使用 Firebase Cloud Messaging 在我的 Android 设备上接收通知