R: как "объединить ()" всю таблицу данных - PullRequest
0 голосов
/ 24 февраля 2019

Применительно к вопросу: R: составление значений из строк фрейма данных

Привет,

У меня большая таблица данных (1 миллион строк).Каждая строка состоит из 30 значений, а первые четыре идентифицируют один объект.Многие строки могут иметь одинаковые первые четыре поля, что означает, что они относятся к одному и тому же объекту.Остальные 26 полей могут быть числом или «NA».

Дело в том, что во многих строках, относящихся к одному и тому же объекту (или с одинаковыми первыми четырьмя полями), оставшиеся 26 полей будут определены по-разному, и обычносостоящий из множества NA и только нескольких числовых значений.

Я хочу объединить все множественные ссылки (строки) в один объект в одну строку, точно так, как это сделает dplyr :: coalesce (x, y)более 2 векторов.Я пытался идентифицировать все подмножества в таблице и объединять их построчно, используя несколько циклов, но это очень медленно.Есть ли более быстрая альтернатива, которая может эффективно обрабатывать большие таблицы данных (~ 1 миллион строк, 30 полей в строке)?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Я не уверен на сто процентов, что понял ваш ожидаемый результат, но вы можете передать любое количество векторов в coalesce(), что приведет к одному вектору first non-пропущенного значенияслева направо.Это быстро на больших фреймах данных.

v <- c(1:10, rep(NA, 3))
set.seed(5)
df <- data.frame(replicate(30, sample(v, 1e6, replace = TRUE)))

system.time(coalesce(!!!df))

user  system elapsed 
0.07    0.08    0.16 
0 голосов
/ 24 февраля 2019

Что вы хотите сделать, если у вас есть несколько действительных ответов для одной и той же группы?Вам нужен какой-то механизм агрегирования, например, min / max / average / etc.Вот одно решение для вас, использующее операторы by и .SD в data.table.В моем примере я беру max из x1, x2 и x3 из 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

Создано в 2019-02-23 с помощью пакета представитель (v0.2.1)

Обратите внимание на предупреждение: -Inf которые вы могли бы убрать после факта легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...