根据年份合并 data.frames 并填写缺失值

2024-03-31

我有两个 data.frames,我想将它们合并在一起。第一个是:

datess <- seq(as.Date('2005-01-01'), as.Date('2009-12-31'), 'days')
sample<- data.frame(matrix(ncol = 3, nrow = length(datess)))
colnames(sample) <- c('Date', 'y', 'Z')
sample$Date <- datess

第二:

a <- data.frame(matrix(ncol = 3, nrow = 5))
colnames(a) <- c('a', 'y', 'Z')
a$Z <- c(1, 3, 4, 5, 2)
a$a <- c(2005, 2006, 2007, 2008, 2009)
a$y <- c('abc', 'def', 'ijk', 'xyz', 'thanks')

我希望合并后的值与年份相匹配,然后填写该年每一天的其余值。

Date          y      Z
2005-01-01   abc     1
2005-01-02   abc     1 
2005-01-03   abc     1
{cont}
2009-12-31   thanks  2

到目前为止,已经发布了三种不同的方法:

  • using match() https://stackoverflow.com/a/43521841/3817004
  • using dplyr https://stackoverflow.com/a/43521923/3817004
  • using merge() https://stackoverflow.com/a/43522640/3817004

还有第四种方法称为更新加入弗兰克在聊天中建议:

library(data.table)
setDT(sample)[, yr := year(Date)][setDT(a), on = .(yr = a), `:=`(y = i.y, Z = i.Z)]

事实证明这是四个中最快、最简洁的。

基准测试结果:

为了确定哪种方法在速度方面最有效,我使用以下方法设置了基准microbenchmarkpackage.

Unit: microseconds
        expr      min       lq     mean    median       uq      max neval
 create_data  248.827  291.116  316.240  302.0655  323.588  665.298   100
       match 4488.685 4545.701 4752.226 4649.5355 4810.763 6881.418   100
       dplyr 6086.609 6275.588 6513.997 6385.2760 6625.229 8535.979   100
       merge 2871.883 2942.490 3183.712 3004.6025 3168.096 5616.898   100
 update_join 1484.272 1545.063 1710.651 1659.8480 1733.476 3434.102   100

As sample被修改后,必须在每次基准测试运行之前重新创建。这是由基准测试中包含的函数完成的(创建数据)。时间为创建数据需要从其他时间中减去。

因此,即使对于大约 1800 行的小数据集,更新加入是最快的,几乎是第二个的两倍merge, 其次是match, and dplyr是最后一个,慢了 4 倍以上更新加入(与时间创建数据减去)。

基准代码

datess <- seq(as.Date('2005-01-01'), as.Date('2009-12-31'), 'days')
a <- data.frame(Z = c(1, 3, 4, 5, 2),
                a = 2005:2009,
                y = c('abc', 'def', 'ijk', 'xyz', 'thanks'),
                stringsAsFactors = FALSE)
setDT(a)
make_sample <- function() data.frame(Date = datess, y = NA_character_, Z = NA_real_)

library(data.table)
library(magrittr)
microbenchmark::microbenchmark(
  create_data = make_sample(),
  match = {
    sample <- make_sample()
    matched<-match(format(sample$Date,"%Y"),a$a)
    sample$y<-a$y[matched]
    sample$Z<-a$Z[matched]
  },
  dplyr = {
    sample <- make_sample()
    sample <- sample %>% 
      dplyr::mutate(a = format(Date, "%Y") %>% as.numeric) %>% 
      dplyr::inner_join(a %>% dplyr::select(a), by = "a") 
  },
  merge = {
    sample <- make_sample()
    sample2 <- data.frame(Date = datess)
    sample2$a <- lubridate::year(sample2$Date)
    sample <- base::merge(sample2, a, by="a")
  },
  update_join = {
    sample <- make_sample()
    setDT(sample)[, yr := year(Date)][a, on = .(yr = a), `:=`(y = i.y, Z = i.Z)]
  }
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据年份合并 data.frames 并填写缺失值 的相关文章

  • 跟踪循环迭代

    抛硬币 成功 你赢100 否则你输50 你会一直玩 直到你口袋里有钱a 的价值如何a在任何迭代中都被存储 a lt 100 while a gt 0 if rbinom 1 1 0 5 1 a lt a 100 else a lt a 50
  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • 无法更新/编辑从 R 中的包(`gratia`)导出的 ggplot2 对象

    我希望我在这里遗漏了一些令人痛苦的明显的东西 我希望更新 例如 修复标题 实验室等 由 生成的 ggplot 对象gratia draw 不太确定为什么我无法更新该对象 有一个简单的解决方案吗 devtools install github
  • 如何在 Caret 中绘制随机森林(护林员)树

    我生成了如下所示的随机森林树 并尝试绘制它 但出现错误 我在哪里犯了错误 我怎样才能以正确的方式绘制它 Actmodel lt train Activity Section Author data CB1 method ranger trC
  • 如何对数字进行四舍五入并使其显示零?

    R 中将数字四舍五入到小数点后 2 位的常用代码是 gt a 14 1234 gt round a digits 2 gt a gt 14 12 但是 如果该数字的前两位小数位为零 则 R 会在显示中抑制零 gt a 14 0034 gt
  • 为什么数据帧上的 is.vector 不返回 TRUE?

    tl dr R 中的向量到底是什么 长版 R 中很多东西都是向量 例如 数字是长度为 1 的数值向量 is vector 1 1 TRUE 列表也是一个向量 is vector list 1 1 TRUE 好的 所以列表是一个向量 显然 数
  • 将 ftransform 与折叠 R 包中的 fgroup_by 一起使用

    我正在尝试重现以下输出dplyr代码与R包裹collapse dplyr Code library tidyverse starwars gt select name mass species gt group by species gt
  • R 中两个时间戳之间的左连接

    我的目标是执行左连接intervals哪里的bike id比赛和created at时间戳在records在 之间start and end in the intervals table gt class records 1 data ta
  • 正态分布平均值的贝叶斯推理玩具 R 代码 [降雪量数据]

    我有一些降雪观测 x lt c 98 044 107 696 146 050 102 870 131 318 170 434 84 836 154 686 162 814 101 854 103 378 16 256 我被告知它遵循正态分布
  • R 闪亮仪表板中的动态重复条件面板

    我正在尝试创建一个动态条件面板 所以我的条件如下 在用户界面中输入 selectInput inpt Input Number seq 1 50 1 selectize FALSE 我的条件面板 UI 输入是 conditionalPane
  • 在R中循环子文件夹

    我正在 R 环境中包含多个子文件夹的文件夹中工作 我想要循环遍历多个子文件夹 然后在每个子文件夹中调用 R 脚本来执行 我想出了下面的代码 但我的代码似乎添加了 到子文件夹列表 我收到错误 文件中的错误 文件名 r 编码 编码 无效的 描述
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • `dplyr::_join` 函数的命名向量“by”参数[重复]

    这个问题在这里已经有答案了 我正在写一个函数dplyr join两个数据框by不同的列 第一个数据帧的列名称动态指定为函数参数 我相信我需要使用rlang准引用 元编程 但未能找到可行的解决方案 我很感激任何建议 library dplyr
  • `as.matrix` 和 `as.data.frame` S3 方法与 S4 方法

    我注意到定义as matrix or as data frame作为 S4 类的 S3 方法 使例如lm formula objS4 and prcomp object 开箱即用 如果它们被定义为 S4 方法 则这不起作用 为什么将方法定义
  • 更新 R6 对象实例中的方法定义

    如何更新 R6 类实例的方法定义 正如我所期望的 S3 使用当前的方法定义 对于 R5 参考类 我可以使用 myInstance myInstance copy 在 R6 中 我尝试了 myInstance myInstance clone
  • sapply - 保留列名称

    我试图总结数据集中许多不同列 变量 的平均值 标准差等 我已经编写了自己的汇总函数 以准确返回我需要和正在使用的内容sapply立即将此函数应用于所有变量 它工作正常 但是返回的数据帧没有列名 我似乎甚至无法使用列号引用重命名它们 也就是说
  • 从 data.frame 在 ggplot 图例中添加信息

    我想在图例中添加信息 哪个传感器具有该值 这是我的代码 z lt data frame a c sensor 1 sensor 2 sensor 3 sensor 4 sensor 5 sensor 6 sensor 7 sensor 8
  • 在 RMarkdown 输出到 PDF 时缩进而不添加项目符号点或编号

    之前有人问过如何在没有项目符号的情况下缩进文本 RMarkdown 中的点 但这是针对 HTML 输出的 在 RMarkdown 中缩进而不添加项目符号点或数字 https stackoverflow com questions 47087
  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu
  • 如何根据 ggplot2 中的汇总数据创建堆积条形图

    我正在尝试使用 ggplot 2 创建堆积条形图 我的宽格式数据如下所示 每个单元格中的数字是响应的频率 activity yes no dontknow Social events 27 3 3 Academic skills works

随机推荐

  • gulp browserify 捆绑时间太长

    我遇到了一个奇怪的问题 需要你的帮助来弄清楚发生了什么 我已经配置了 gulp 来构建我的测试React js在 ES6 中 我用过browserify设置 CommonJS 环境并babelify以获得更大的 ES6 支持 一切正常 只是
  • 矩阵作为应用函子,不是 Monad

    我遇到examples https stackoverflow com questions 7220436 good examples of not a functor functor applicative monad不是 Monad 的
  • 峰值检测代码

    我想计算实时信号在第一步中是否通过了一些阈值 在第一步中 我想检测真实信号是否低于这些阈值 以便检测信号中的峰值 我的Matlab代码 k 1 t 1 l 1 for i 1 length sm sm my signal if sm i g
  • 如何在Spring Security中动态切换应用程序上下文?

    我在我的 Web 应用程序中使用 Spring security 并使用 Javaconfig 最近 我们还在应用程序中添加了 Spring SAML 身份验证 并在经历了一些障碍后终于使其正常工作 在 的里面WebApplicationI
  • 您使用哪些工具在浏览器中调试 HTML/JS?

    我想收集适用于所有浏览器的最佳调试辅助工具 所以这可能是Firebug https addons mozilla org de firefox addon 1843对于 Firefox 那么你用什么来使用 IE 呢 苹果浏览器 歌剧 歌剧迷
  • C++:深度复制基类指针

    我四处搜索 似乎为了执行此操作 我需要更改我的基类 并想知道这是否是最好的方法 例如 我有一个基类 class Base 然后是一长串派生类 class Derived 1 public Base class Derived 2 publi
  • 仅将指定 div 的英文数字转换为波斯语/阿拉伯语

    我知道这个问题已经在这里回答了很多次 但我仍然没有得到确切的答案 我需要通过一些javascript将英文字母转换为波斯语 阿拉伯语字母 但不是整个页面 而是一个div或者更多 就像只针对特定类别一样 我遇到过这些代码 但不知道哪一个最好用
  • 指定形状宽度会生成错误:指定的尺寸对于当前图表类型无效

    我正在尝试将 Excel 图表另存为图像 通过整个代码 我调用了几个工作簿 查找所有工作表并保存所有图表 以下代码适用于 Excel 2007 和 2010 但由于 4 有可见的水平线和垂直线 如果我改变Round shp Width 4
  • Groupby pandas dataframe 具有相同值的两列

    我想要groupby A 和 B 中具有相同值的两列并制作cumsum基于该值所在的列 值的分组数据框示例 A B ValueA ValueB 0 b a 1 3 1 c a 2 2 2 a b 2 4 现在 如果该值位于 A 列中 则考虑
  • 从 Iron Python 生成 .NET 程序集

    我有一个 Iron Python 脚本 我想运行它 然后让 ipy 解释器输出一个可以在其他计算机上运行的程序集 我怎么做 是否有一个开关可以传递给 ipy exe 使用SharpDevelop 一种方法是使用夏普开发 http www i
  • 通过读取初始 .DBF 字节可以采用哪种标头格式?

    关于 DBF文件的第一个字节以及如何检测所使用的xbase版本 即文件其余部分的格式 我可以编译的最全面的列表是 Byte 0 x xxx x 001 0x 1 not used 0 000 0 010 0x02 FoxBASE 0 000
  • Ember.js - jQuery-masonry + 无限滚动

    我正在尝试在我的 ember 项目中实现无限滚动和砌体工作 砖石 砖块 是带有文字和图像的柱子 目前 我可以在页面初始加载时显示第一页并应用砌体 不过 我仍然需要执行 setTimeout 试图找出如何摆脱它 我还有基本的无限滚动代码 现在
  • 使用 Web 部署发布 ASP.NET MVC2 站点

    我目前使用 Web 部署 http learn iis net page aspx 346 web deploy http learn iis net page aspx 346 web deploy 发布我的 MVC2 应用程序 它曾经工
  • file_get_contents() 修改后的 HTTP 标头返回垃圾 html 输出

    以下代码用于使用 PHP 的 SIMPLETHTMLDOM 解析器提取 html include simple html dom php context stream context create array http gt array m
  • 在SAX解析期间确定根元素

    我正在使用 SAX 来解析 XML 文件 假设我希望我的应用程序only处理带有根元素 animalList 的 XML 文件 如果根节点是其他节点 SAX 解析器应该终止解析 使用 DOM 你可以这样做 Element rootEleme
  • 在 Flutter 中使用 After Effects 文件

    我知道如何导出Rive在 Flutter 应用程序中使用的 Flare 文件 但我怎样才能import Adobe 后遗症文件到 Rive 我知道可以这样做Lottie但我无法弄清楚如何准确地做到这一点 您可以轻松导入 bodymovin
  • 如何使用 Jest 和 vue/test-utils 测试输入文件

    我想使用 Jest 和 vue test utils 测试文件上传器组件 我有这个 describe show progress bar of uploading file gt const wrapper mount FileUpload
  • 如何在 lldb 中创建和使用临时 NSRange?

    NSRange 只是一个 C 结构体 我想在 Xcode 的 lldb 中的断点处创建一个临时的 专门用于 NSArray 方法objectAtIndex inRange 这是行不通的 lldb expr NSRange tmpRange
  • 高效更新 Bokeh 中的图像图以实现交互式可视化

    我正在尝试使用 Bokeh 创建多维数组的不同切片的平滑交互式可视化 切片中的数据根据 用户交互而变化 因此每秒必须更新几次 我编写了一个 Bokeh 应用程序 其中包含几个小图像图 64x64 值 来显示切片的内容 以及在用户与应用程序交
  • 根据年份合并 data.frames 并填写缺失值

    我有两个 data frames 我想将它们合并在一起 第一个是 datess lt seq as Date 2005 01 01 as Date 2009 12 31 days sample lt data frame matrix nc