Эффективный подсчет уникальных подмножеств данных

У меня есть относительно большой набор данных, который я бы не назвал «большими данными». Это от 3 до 5 миллионов строк; из-за размера я использую библиотеку data.table для анализа.

Состав набора данных (названный df, который представляет собой структуру data.table) можно по существу разбить на:

  1. n идентифицируют поля, в дальнейшем ID_1, ID_2, ..., ID_n, некоторые из которых являются числовыми, а некоторые - векторными.

  2. m категориальных переменных, далее C_1, ..., C_m, все из которых являются векторами символов и имеют очень мало значений (2 в одном, 3 в другом и т. д.)

  3. 2 измерительные переменные, M_1 и M_2, обе числовые.

Подмножество данных идентифицируется от ID_1 до ID_n, имеет полный набор всех значений от C_1 до C_m и имеет диапазон значений от M_1 и M_2. Подмножество данных состоит из 126 записей.

Мне нужно точно подсчитать уникальные наборы данных, и из-за размера данных я хотел бы знать, существует ли уже более эффективный способ сделать это. (Зачем катить свою, если это уже сделали другие, гораздо более умные люди?)

Я уже проделал значительную работу в Google, чтобы найти метод, описанный ниже.

Я использовал пакет ht (https://github.com/nfultz/ht), чтобы я мог использовать фрейм данных в качестве хэш-значения (используя дайджест в фоновом режиме).

Я объединяю поля идентификатора, чтобы создать новый единственный столбец, в дальнейшем называемый ID, который напоминает ...

ID = "ID1:ID2:...:IDn"

Затем я просматриваю каждый уникальный набор идентификаторов, а затем, используя только фрейм данных поднабора от C_1 до C_m, M_1 и M_2 (126 строк данных), хэширую значение / увеличиваю хэш.

После этого я беру эту информацию и помещаю ее обратно во фрейм данных.

# Create the hash structure
datasets <- ht()
# Declare the fields which will denote a subset of data
uniqueFields <- c("C_1",..."C_m","M_1","M_2")
# Create the REPETITIONS field in the original data.table structure
df[,REPETITIONS := 0]
# Create the KEY field in the original data.table structure
df[,KEY := ""]

# Use the updateHash function to fill datasets
updateHash <- function(val){
    key <- df[ID==val, uniqueFields, with=FALSE]
    if (isnull(datasets[key])) {
        # If this unique set of data doesn't already exist in datasets...
        datasets[key] <- list(val)
    } else {
        # If this unique set of data does already exist in datasets...
        datasets[key] <- append(datasets[key],val)
    }
}

# Loop through the ID fields. I've explored using apply;
# this vector is around 10-15K long. This version works.
for (id in unique(df$ID)) {
    updateHash(id)
}

# Now update the original data.table structure so the analysis can
# be done. Again, I could use the R apply family, this version works.
for(dataset in ls(datasets)){
    IDS <- unlist(datasets[[dataset]]$val)
    # For this set of information, how many times was it repeated?
    df[ID%in%IDS, REPETITIONS := length(datasets[[dataset]]$val)]
    # For this set, what is a unique identifier?
    df[ID%in%IDS, KEY := dataset]
}

Это делает то, что я хочу, но не так быстро. Теперь у меня есть возможность представить аккуратный анализ вариативности наборов данных людям, которым это небезразлично. Мне не нравится, что это хоккей, и, так или иначе, я собираюсь почистить это и сделать лучше. Прежде чем я это сделаю, я хочу провести последнюю должную осмотрительность и посмотреть, не подводит ли меня просто мой Google Fu.

Привет и добро пожаловать в Stack Overflow. Если бы вы могли привести пример своих данных, вам было бы легче помочь и сделать вашу проблему воспроизводимой. Не могли бы вы добавить к вашему вопросу вывод dput(head(df,20))? А также как должен выглядеть результат?

Mr_Z 18.12.2018 16:58

Mr_Z, к сожалению, я не могу добавить вывод (он находится в автономной сети) и не могу подробно описать данные. Если абсолютно необходимо, я добавлю код, чтобы смоделировать набор данных. Результатом этого алгоритма должно быть то, что каждое поле уникального идентификатора имеет несколько связанных ПОВТОРЕНИЙ. Это число нет - количество раз, когда ID виден (это был бы один), а, скорее, количество раз, когда подмножество уникальных данных полей повторяется для всех экземпляров ID.

Timothy Luna 18.12.2018 17:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
57
0

Другие вопросы по теме