r - R:如何“合并()”整个数据表
问题描述
参考问题:R:从数据框的行中堆叠值
你好,
我有一个大的 data.table(100 万行)。每行包含 30 个值,前四个标识一个对象。许多行可能具有相同的前四个字段,这意味着它们被引用到同一个对象。其余 26 个字段可以是数字或“NA”。
关键是引用同一对象的许多行(或具有相同的前四个字段)将具有不同定义的其余 26 个字段,并且通常包含大量 NA 和只有少数数值。
我想将单个对象的所有多个引用(行)合并到一行中,就像 dplyr::coalesce (x,y) 会做超过 2 个向量一样。我试图将所有子集识别到表中,并使用一些循环逐行合并它们,但这非常慢。是否有更快的替代方案可以有效地处理大型数据表(约 100 万行,每行 30 个字段)?
非常感谢。
解决方案
当您对同一组有多个有效答案时,您想做什么?您需要某种聚合机制,即最小/最大/平均/等。这是by
一种利用.SD
. data.table
在我的示例中,我采用max
of x1
、x2
和x3
by id
。这会将三行每行折叠id
为一行。
library(data.table)
dt <- data.table(id = rep(1:4, each = 3), x1 = c(1,NA,2,NA,3,NA,4,NA,5,NA,6,NA), x2 = c(NA,6,NA,5,NA,4,NA,3,NA,2,NA,NA), x3 = c(12,NA,NA,11, NA, NA, 10, NA,NA,NA, NA, NA))
dt[, lapply(.SD, max, na.rm = TRUE),keyby = id]
#> Warning in gmax(x3, na.rm = TRUE): No non-missing values found in at least
#> one group. Returning '-Inf' for such groups to be consistent with base
#> id x1 x2 x3
#> 1: 1 2 6 12
#> 2: 2 3 5 11
#> 3: 3 5 3 10
#> 4: 4 6 2 -Inf
由reprex 包(v0.2.1)于 2019 年 2 月 23 日创建
请注意警告:-Inf
您可以在事后轻松清理它。
推荐阅读
- ruby-on-rails - 红宝石猴子在飞行中修补
- parse-server - 我想将 Nuxt 与解析 javascript 客户端一起使用
- php - 如何在 PHP 中将 base64 字符串转换为 png 图像?
- postgresql - 从另一个表中选择随机 ID ....对 LATERAL JOIN 感到困惑
- javascript - 如何优化 API 获取以减少冗余
- flutter - 颤振位置网格元素
- css - Bootstrap 不使用 Webpack 应用 CSS
- python - Visual Studio Code Python 笔记本输出扩展?
- c# - 将 linq 类型方法与 IAsyncEnumerable 一起使用的正确方法是什么?
- node.js - 设置 Nodemailer 以使用 STARTLS 握手来保护电子邮件?