Неожиданные значения в DataFrame после изменения формы - PullRequest
3 голосов
/ 03 мая 2020

Итак, у меня есть следующая функция изменения формы:

reshaped <- function(df){
df %>%
  select(subjects, diseases) %>% 
  group_by(subjects, diseases) %>%
  count() %>%
  ungroup() %>%
  spread(diseases, n, drop=TRUE)}

, которая существенно расширяет данные от длинных к широким, заполняя записи числом вхождений или значениями NA. Теперь, когда я распространяю это и печатаю в консоль, я получаю что-то вроде:

subject    disease1  disease2  disease3 ...
1111111        2         3         1
1111112        21        4         2
1111115        2         1         15
1111117        1         3         1

Теперь проблема в том, что эти числа ложные. Субъект 1111111 не имеет 2 экземпляров disease1 или 3 экземпляров disease2 и т. Д. c. Все записи должны быть заполнены значениями NA. На самом деле, эти disease_1, disease2, disease3 являются супер-редкими заболеваниями, которые редко встречаются вообще по всем данным, но просто случаются первыми в алфавитном порядке (все начинаются с A).

Есть еще несколько вещей, о которых нужно знать. Во-первых, это очень большой набор данных с измененной версией, содержащей около 38 000 столбцов и 1,2 миллиона строк. Для обработки этих данных (порциями) я использую около 400 ГБ ОЗУ, а в сжатом формате RD весит около 117 ГБ. Я не получаю ошибок памяти, однако. Интересно, что когда я выбираю, скажем, случайные 100 000 предметов (строк), эта проблема исчезает. Цифры, которые я вижу, вполне реалистичны c (в основном, NA). Это говорит о том, что проблема не в самой функции или данных, а в размере наблюдения.

Кто-нибудь может подсказать, почему это может происходить или как я могу это решить? Для меня это выглядит как некоторая форма переполнения, когда R не знает, что делать, когда размер данных слишком велик, и просто помещает туда значения мусора. Проблема с этой гипотезой заключается в том, что эти значения, хотя и необоснованные, не являются полностью случайными. Все они меньше 10 или около того.

...