首页 > 解决方案 > R:如何“合并()”整个数据表

问题描述

参考问题:R:从数据框的行中堆叠值

你好,

我有一个大的 data.table(100 万行)。每行包含 30 个值,前四个标识一个对象。许多行可能具有相同的前四个字段,这意味着它们被引用到同一个对象。其余 26 个字段可以是数字或“NA”。

关键是引用同一对象的许多行(或具有相同的前四个字段)将具有不同定义的其余 26 个字段,并且通常包含大量 NA 和只有少数数值。

我想将单个对象的所有多个引用(行)合并到一行中,就像 dplyr::coalesce (x,y) 会做超过 2 个向量一样。我试图将所有子集识别到表中,并使用一些循环逐行合并它们,但这非常慢。是否有更快的替代方案可以有效地处理大型数据表(约 100 万行,每行 30 个字段)?

非常感谢。

标签: rdataframedatatabledplyr

解决方案


当您对同一组有多个有效答案时,您想做什么?您需要某种聚合机制,即最小/最大/平均/等。这是by一种利用.SD. data.table在我的示例中,我采用maxof x1x2x3by 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您可以在事后轻松清理它。


推荐阅读